python函式裝飾函式 Python函式裝飾器

2021-10-19 02:02:48 字數 1747 閱讀 8858

本文來介紹一下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 正確的...