freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

python學(xué)習(xí)筆記-資料下載頁

2025-08-04 23:25本頁面
  

【正文】 8192021222324252627282930313233343536!/usr/bin/env pythoncoding:utf8defBefore(request,kargs):print39。before39。defAfter(request,kargs):print39。after39。defFilter(before_func,after_func):defouter(main_func):defwrapper(request,kargs):before_result=before_func(request,kargs)if(before_result !=None):returnbefore_result。main_result=main_func(request,kargs)if(main_result !=None):returnmain_result。after_result=after_func(request,kargs)if(after_result !=None):returnafter_result。returnwrapperreturnouter@Filter(Before, After)defIndex(request,kargs):print39。index39。if__name__==39。__main__39。:Index(1,2)反射的應(yīng)用:裝飾器:代碼運(yùn)行期間動態(tài)增加功能的方式,稱之為“裝飾器”(Decorator)。作者:zhijun liu鏈接:來源:知乎著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。裝飾器本質(zhì)上是一個(gè)函數(shù),該函數(shù)用來處理其他函數(shù),它可以讓其他函數(shù)在不需要修改代碼的前提下增加額外的功能,裝飾器的返回值也是一個(gè)函數(shù)對象。它經(jīng)常用于有切面需求的場景,比如:插入日志、性能測試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等應(yīng)用場景。裝飾器是解決這類問題的絕佳設(shè)計(jì),有了裝飾器,我們就可以抽離出大量與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。先來看一個(gè)簡單例子:def foo(): print(39。i am foo39。)現(xiàn)在有一個(gè)新的需求,希望可以記錄下函數(shù)的執(zhí)行日志,于是在代碼中添加日志代碼:def foo(): print(39。i am foo39。) (foo is running)bar()、bar2()也有類似的需求,怎么做?再寫一個(gè)logging在bar函數(shù)里?這樣就造成大量雷同的代碼,為了減少重復(fù)寫代碼,我們可以這樣做,重新定義一個(gè)函數(shù):專門處理日志 ,日志處理完之后再執(zhí)行真正的業(yè)務(wù)代碼def use_logging(func): (%s is running % ) func()def bar(): print(39。i am bar39。)use_logging(bar)邏輯上不難理解,而且運(yùn)行正常。 但是這樣的話,我們每次都要將一個(gè)函數(shù)作為參數(shù)傳遞給use_logging函數(shù)。而且這種方式已經(jīng)破壞了原有的代碼邏輯結(jié)構(gòu),之前執(zhí)行業(yè)務(wù)邏輯時(shí),執(zhí)行運(yùn)行bar(),但是現(xiàn)在不得不改成use_logging(bar)。那么有沒有更好的方式的呢?當(dāng)然有,答案就是裝飾器。簡單裝飾器def use_logging(func): def wrapper(*args, **kwargs): (%s is running % ) return func(*args, **kwargs) return wrapperdef bar(): print(39。i am bar39。)bar = use_logging(bar)bar()函數(shù)use_logging就是裝飾器,它把真正的業(yè)務(wù)方法func包裹在函數(shù)里面,看起來像bar被use_logging裝飾了。在這個(gè)例子中,函數(shù)進(jìn)入和退出時(shí) ,被稱為一個(gè)橫切面(Aspect),這種編程方式被稱為面向切面的編程(AspectOriented Programming)。@符號是裝飾器的語法糖,在定義函數(shù)的時(shí)候使用,避免再一次賦值操作def use_logging(func): def wrapper(*args, **kwargs): (%s is running % ) return func(*args) return wrapper@use_loggingdef foo(): print(i am foo)@use_loggingdef bar(): print(i am bar)bar()如上所示,這樣我們就可以省去bar = use_logging(bar)這一句了,直接調(diào)用bar()即可得到想要的結(jié)果。如果我們有其他的類似函數(shù),我們可以繼續(xù)調(diào)用裝飾器來修飾函數(shù),而不用重復(fù)修改函數(shù)或者增加新的封裝。這樣,我們就提高了程序的可重復(fù)利用性,并增加了程序的可讀性。裝飾器在Python使用如此方便都要?dú)w因于Python的函數(shù)能像普通的對象一樣能作為參數(shù)傳遞給其他函數(shù),可以被賦值給其他變量,可以作為返回值,可以被定義在另外一個(gè)函數(shù)內(nèi)。帶參數(shù)的裝飾器裝飾器還有更大的靈活性,例如帶參數(shù)的裝飾器:在上面的裝飾器調(diào)用中,比如@use_logging,該裝飾器唯一的參數(shù)就是執(zhí)行業(yè)務(wù)的函數(shù)。裝飾器的語法允許我們在調(diào)用時(shí),提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。def use_logging(level): def decorator(func): def wrapper(*args, **kwargs): if level == warn: (%s is running % ) return func(*args) return wrapper return decorator@use_logging(level=warn)def foo(name=39。foo39。): print(i am %s % name)foo()上面的use_logging是允許帶參數(shù)的裝飾器。它實(shí)際上是對原有裝飾器的一個(gè)函數(shù)封裝,并返回一個(gè)裝飾器。我們可以將它理解為一個(gè)含有參數(shù)的閉包。當(dāng)我 們使用@use_logging(level=warn)調(diào)用的時(shí)候,Python能夠發(fā)現(xiàn)這一層的封裝,并把參數(shù)傳遞到裝飾器的環(huán)境中。類裝飾器再來看看類裝飾器,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。使用類裝飾器還可以依靠類內(nèi)部的\_\_call\_\_方法,當(dāng)使用 @ 形式將裝飾器附加到函數(shù)上時(shí),就會調(diào)用此方法。class Foo(object): def __init__(self, func): = func def __call__(self): print (39。class decorator runing39。) () print (39。class decorator ending39。)@Foodef bar(): print (39。bar39。)bar()使用裝飾器極大地復(fù)用了代碼,但是他有一個(gè)缺點(diǎn)就是原函數(shù)的元信息不見了,比如函數(shù)的docstring、__name__、參數(shù)列表,先看例子:裝飾器def logged(func): def with_logging(*args, **kwargs): print + was called return func(*args, **kwargs) return with_logging函數(shù)@loggeddef f(x): does some math return x + x * x該函數(shù)完成等價(jià)于:def f(x): does some math return x + x * xf = logged(f)不難發(fā)現(xiàn),函數(shù)f被with_logging取代了,當(dāng)然它的docstring,__name__就是變成了with_logging函數(shù)的信息了。print prints 39。with_logging39。print prints None這個(gè)問題就比較嚴(yán)重的,wraps本身也是一個(gè)裝飾器,它能把原函數(shù)的元信息拷貝到裝飾器函數(shù)中,這使得裝飾器函數(shù)也有和原函數(shù)一樣的元信息了。from functools import wrapsdef logged(func): @wraps(func) def with_logging(*args, **kwargs): print + was called return func(*args, **kwargs) return with_logging@loggeddef f(x): does some math return x + x * xprint prints 39。f39。print prints 39。does some math39。內(nèi)置裝飾器@staticmathod、@classmethod、@property裝飾器的順序@a@b@cdef f ():等效于f = a(b(c(f)))面向?qū)ο缶幊蹋侯悓傩裕o態(tài)屬性)和實(shí)例屬性靜態(tài)方法: Property裝飾器:方法轉(zhuǎn)化為屬性 只讀特性與只寫特性: __call__是一個(gè)很神奇的特性,只要某個(gè)類型中有__call__方法,我們可以把這個(gè)類型的對象當(dāng)作函數(shù)來使用。,Python中類的初始化方法是__init__(),因此父類子類的初始化方法都是這個(gè),如果子類不實(shí)現(xiàn)這個(gè)函數(shù),初始化時(shí)調(diào)用父類的初始化函數(shù),如果子類實(shí)現(xiàn)這個(gè)函數(shù),就覆蓋了父類的這個(gè)函數(shù),既然繼承父類,就要在這個(gè)函數(shù)里顯式調(diào)用一下父類的__init__(),這跟C++,Java不一樣,他們是自動調(diào)用父類初始化函數(shù)的。調(diào)用父類函數(shù)有以下方法:[python]view plaincopy1. classA:2. defmethod(self,arg):3. pass4. 5. classB(A):6. defmethod(self,arg):7. (self,arg)18. super(B,self).method(arg)29. super().method(arg)3super(type,obj).method(arg)方法調(diào)用。,可以直接super().method(arg).在代碼中調(diào)用對象的父類的方法的示例:[python]view plaincopy1. ob=B()2. super(B,ob).method(arg)調(diào)用classB的父類classA的method。初始化中調(diào)用父類初始化方法示例:[python]
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1