轉(zhuǎn)載自python @ 用法
簡(jiǎn)單的說呀狼,@裝飾器就是用來提供調(diào)用的界逛,
def funA(arg):
print 'A'
a=arg()
@funA
def funB():
print 'B'
輸出結(jié)果為
此處的@相當(dāng)于funA(funB())右锨。
裝飾器背后的主要?jiǎng)訖C(jī)源自python面向?qū)ο缶幊谭环颍b飾器是在函數(shù)調(diào)用之上的修飾咏窿,這些修飾僅是當(dāng)聲明一個(gè)函數(shù)或者方法的時(shí)候斟或,才會(huì)應(yīng)用的額外調(diào)用。
裝飾器的語法以@開頭集嵌,接著是裝飾器韓式的名字和可選的參數(shù)萝挤。緊跟著裝飾器聲明的是被修飾的函數(shù),和修飾函數(shù)的可選參數(shù)根欧。
class MyClass(obj):
@staticmethod
def staticFoo():
...
利用staticmethod內(nèi)建函數(shù)來將這個(gè)函數(shù)“轉(zhuǎn)化”為靜態(tài)方法怜珍,利用裝飾器會(huì)很簡(jiǎn)潔。
@g
@f
def foo():
...
..與foo=g(f(foo))相同
有參數(shù)和無參數(shù)的裝飾器
@deco
def foo():
pass
…非常直接
foo=deco(foo)
有參數(shù)的裝飾器
@decomaker(deco_args)
deffoo():
pass
需要自己返回以函數(shù)作為參數(shù)的裝飾器凤粗,換句話說酥泛,decomaker()用deco_args做了些事情并返回函數(shù)對(duì)象,而該函數(shù)正是以foo作為其參數(shù)的裝飾器,相當(dāng)于:
foo=decomaker(deco_args)(foo)
多個(gè)裝飾器的例子揭璃,其中一個(gè)裝飾器帶有一個(gè)參數(shù):
@deco1(deco_args)
@deco2
def func():pass
等價(jià)于:
func=deco1(deco_args) (deco2(func))
什么是裝飾器
現(xiàn)在我們知道裝飾器實(shí)際上就是一個(gè)函數(shù)晚凿,我們也知道他們接受函數(shù)對(duì)象,但他們是怎么處理那些函數(shù)瘦馍?當(dāng)你包裝一個(gè)函數(shù)的時(shí)候歼秽,你最終會(huì)調(diào)用它,最棒的是我們能夠在包裝的環(huán)境下在合適的時(shí)機(jī)調(diào)用它情组,我們?cè)趫?zhí)行函數(shù)之前燥筷,可以運(yùn)行那些預(yù)備代碼,如 post-morren分析院崇,也可以在執(zhí)行代碼之后做個(gè)清理工作肆氓,所以當(dāng)你看見一個(gè)裝飾器函數(shù)的時(shí)候,很可能在里面找到這樣一些代碼底瓣,它定義了某個(gè)函數(shù)并在定義內(nèi)的某處嵌入了對(duì)目標(biāo)函數(shù)的調(diào)用或者至少一些引用谢揪。從本質(zhì)上看,這些特征引入了java開發(fā)者稱之為AOP的概念捐凭,可以考慮在裝飾器中置入通用功能的代碼來降低程序復(fù)雜度拨扶。
可以用裝飾器來:
- 引入日志
- 增加計(jì)時(shí)邏輯來檢測(cè)性能
- 給函數(shù)加入事物能力。