python中的裝飾器的理解

2021-10-01 09:01:43 字數 1878 閱讀 4187

python裝飾器(fuctional decorators)就是用於拓展原來函式功能的一種函式,目的是在不改變原函式名(或類名)的情況下,給函式增加新的功能。 比如:日誌功能,增加時間。

這個函式的特殊之處在於它的返回值也是乙個函式,這個函式是內嵌「原「」函式的函式。

裡的deco函式就是最原始的裝飾器,它的引數是乙個函式,然後返回值也是乙個函式。

f()函式就相當於被注入了計時功能,現在只要呼叫f(),它就已經變身為「新的功能更多」的函式了,

(不需要重複執行原函式)。

import time

defdeco

(f):

def(a,b)

: start_time = time.time(

) f(a,b)

end_time = time.time(

) execution_time =

(end_time - start_time)

*1000

print

("time is %d ms"

% execution_time)

# 執行的相當於 f(a,b) = dec0(f(a,b))

@deco

deff

(a,b)

:print

("be on"

) time.sleep(1)

print

("result is %d"

%(a+b)

)if __name__ ==

'__main__'

: f(3,

4)

用多個裝飾器來修飾函式的執行順序。

import time

defdeco01

(f):

def(

*args,

**kwargs)

:print

("this is deco01"

) start_time = time.time(

) f(

*args,

**kwargs)

end_time = time.time(

) execution_time =

(end_time - start_time)

*1000

print

("time is %d ms"

% execution_time)

print

("deco01 end here"

)def

deco02

(f):

def(

*args,

**kwargs)

:print

("this is deco02"

) f(

*args,

**kwargs)

print

("deco02 end here"

)@deco01

@deco02

deff

(a,b)

:print

("be on"

) time.sleep(1)

print

("result is %d"

%(a+b)

)if __name__ ==

'__main__'

: f(3,

4)

裝飾器是可以疊加使用的,那麼使用裝飾器以後**是啥順序呢?

對於python中的」@」語法糖,裝飾器的呼叫順序與使用 @ 語法糖宣告的順序相反。

在這個例子中,」f(3, 4) = deco01(deco02(f(3, 4)))」。

Python中的裝飾器理解

主要記住兩個例子就好 1.裝飾器含有不確定引數 需要注意 1.裝飾器的引數func為函式,裝飾器內部函式 deco的引數 args,kwargs為func函式傳入的不確定性變數。2.裝飾器以輸出的函式作為形參,返回內部自定義的函式 內部自定義的函式返回形參傳入的函式 所以可認為,裝飾器傳入函式,返回...

python中的裝飾器理解

python裝飾器 fuctional decorators 就是用於拓展原來函式功能的一種函式,目的是在不改變原函式名 或類名 的情況下,給函式增加新的功能。這個函式的特殊之處在於它的返回值也是乙個函式,這個函式是內嵌 原 函式的函式。之前拓展函式的做法是侵入原函式進行拓展修改,例如 原始函式 i...

關於Python中的裝飾器理解

裝飾器的作用就是 重用!import time 定義乙個能夠直接測試程式執行時間的 def timenumber func fronttime time.time func endtime time.time print 這個程式花了 f毫秒 endtime fronttime 1000 def m...