本文來介紹一下python的函式裝飾器,類裝飾器以後另開一文講。
裝飾器可以看做是python中的乙個語法糖,基本的寫法示例如下:
defdecorator(func):returnfunc
@decoratordeffunction():print "666"
decorator即是function的裝飾器,在function函式前面加上@decorator的字首相當於:
function = decorator(function)
所以之後對function的呼叫實際上都是在呼叫decorator。
以上只是最最簡單的寫法,一般裝飾器會在函式內部定義一些自己的操作,相當於「裝飾」了原本的函式。例如:
importtimedefdecorator(func):def clocked(*args):
t0=time.time()
result= func(*args)
elapsed= time.time() -t0
name= func.__name__
printelapsed, name, resultreturnresultreturnclocked
@decoratordeffunction():print "666"function()print function
輸出如下:
0.0function none
可以看到:
1.該裝飾器的作用是輸出所裝飾函式的執行時間,和函式名以及返回值
2.通過輸出function,可以發現此時它已經被替換成了clocked,這與前面講的「function = decorator(function)」是吻合的。
另外關於裝飾器要注意的一點是:裝飾器是在載入該模組的時候執行的。舉個例子,假設有如下**:
defdecorator(func):print "7777"
returnfunc
@decoratordeffunction():print "666"
if __name__ == '__main__':print "start!"function()
執行該py檔案後輸出如下:
7777start!666
可以看到,「777」出現在「start!」之前,這說明裝飾器是在實際執行該模組之前輸出的。
裝飾器是可以累加的,
defdecorator1(func):print "666"
returnfuncdefdecorator2(func):print "777"
returnfunc
@decorator2
@decorator1deffunction():print "88"
等同於function = decorator2(decorator1(function))
如果我們想給裝飾器傳入引數,該如何做呢?這就需要我們建立乙個裝飾器工廠函式,把引數傳給它,返回乙個裝飾器,然後再把它應用到要裝飾的函式上。具體示例如下:
importtimedef decorator(is_active=true):defdec1(func):ifis_active:print "888"
else:print "777"
returnfuncreturndec1
@decorator(true)deffunction():print "666"
dec1才是真正的裝飾器(它的引數是func),decorator可以理解為乙個裝飾器工廠,它返回相應的裝飾器函式。
這次裝飾器就講解到這裡,之後有時間會再講解一下類裝飾器。
python 函式裝飾 Python 函式裝飾器
無引數的 函式裝飾器 funa 作為裝飾器函式 def funa fn print sakura func a fn 執行傳入的fn引數 print sakura second return sakura return funa def funb print sakurab 返回結果為 sakura...
python 函式裝飾 Python 函式裝飾器
首次接觸到裝飾器的概念,太菜啦!python 裝飾器可以大大節省 的編寫量,提公升 的重複使用率。函式裝飾器其本質也是乙個函式,我們可以把它理解為函式中定義了乙個子函式。例如我們有這麼乙個需求,每次執行乙個函式後,需要知道這個函式執行了多長時間。一般情況下,我會這樣寫 defaccumulate n...
python 裝飾函式
此文的最後乙個蛋疼的例子可以幫助理解這個概念,錯誤寫法 def warp fun print fun print warp def myprint print lalala myprint 這句並沒有卵用,刪掉這句也會有輸出,輸出是由 warp這句列印的 print myprint none 正確的...