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...