如何使用Python的命名空間、作用域和裝飾器_第1頁(yè)
如何使用Python的命名空間、作用域和裝飾器_第2頁(yè)
如何使用Python的命名空間、作用域和裝飾器_第3頁(yè)
如何使用Python的命名空間、作用域和裝飾器_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第如何使用Python的命名空間、作用域和裝飾器?username:nick

password:123

baseoffile

loginsuccessful

welcometoindex

六、類裝飾器

沒錯(cuò),裝飾器不僅可以是函數(shù),還可以是類,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。使用類裝飾器主要依靠類的__call__方法,當(dāng)使用@形式將裝飾器附加到函數(shù)上時(shí),就會(huì)調(diào)用此方法。

classFoo(object):

def__init__(self,func):

self._func=func

def__call__(self):

print(classdecoratorruning)

self._func()

print(classdecoratorending)

defbar():

print(bar)

bar()

functools.wraps

使用裝飾器極大地復(fù)用了代碼,但是他有一個(gè)缺點(diǎn)就是原函數(shù)的元信息不見了,比如函數(shù)的docstring、__name__、參數(shù)列表,先看例子:

#裝飾器

deflogged(func):

defwith_logging(*args,**kwargs):

printfunc.__name__#輸出with_logging

printfunc.__doc__#輸出None

returnfunc(*args,**kwargs)

returnwith_logging

@logged

deff(x):

doessomemath

returnx+x*x

logged(f)

不難發(fā)現(xiàn),函數(shù)f被with_logging取代了,當(dāng)然它的docstring,__name__就是變成了with_logging函數(shù)的信息了。好在我們有functools.wraps,wraps本身也是一個(gè)裝飾器,它能把原函數(shù)的元信息拷貝到裝飾器里面的func函數(shù)中,這使得裝飾器里面的func函數(shù)也有和原函數(shù)foo一樣的元信息了。

fromfunctoolsimportwraps

deflogged(func):

@wraps(func)

defwith_logging(*args,**kwargs):

printfunc.__name__#輸出f

printfunc.__doc__#輸出doessomemath

returnfunc(*args,**kwargs)

returnwith_logging

@logged

deff(x):

doessomemath

returnx+x*x

七、裝飾器順序

一個(gè)函數(shù)還可以同時(shí)定義多個(gè)裝飾器,比如:

deff():

pass

它的執(zhí)行順序是從里到外,最先調(diào)用最里層的裝飾器,最后調(diào)用最外層的裝飾器,它等效于

f=a(b(c(f)))

八、裝飾器使用場(chǎng)景

現(xiàn)在我們來看一下裝飾器在哪些地方特別耀眼,以及使用它可以讓一些事情管理起來變得更簡(jiǎn)單。

授權(quán)(Authorization)

裝飾器能有助于檢查某個(gè)人是否被授權(quán)去使用一個(gè)web應(yīng)用的端點(diǎn)(endpoint)。它們被大量使用于Flask和Djangoweb框架中。這里是一個(gè)例子來使用基于裝飾器的授權(quán):

fromfunctoolsimportwraps

defrequires_auth(f):

@wraps(f)

defdecorated(*args,**kwargs):

auth=request.authorization

ifnotauthornotcheck_auth(auth.username,auth.password):

authenticate()

returnf(*args,**kwargs)

returndecorated

日志(Logging)

日志是裝飾器運(yùn)用的另一個(gè)亮點(diǎn)。這是個(gè)例子:

fromfunctoolsimportwraps

deflogit(func):

@wraps(func)

defwith_logging(*args,**kwargs):

print(func.__name__+wascalled)

returnfun

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論