裝飾器函式 二

2022-09-11 21:57:18 字數 1495 閱讀 4254

裝飾器高階

1.帶引數的裝飾器

就是在原有裝飾器的基礎上引入乙個新的引數

多套一層函式,多傳乙個引數決定是否執行新增的功能,只是利用閉包多傳了乙個引數

和裝飾器的原理一樣,這次是把外界要傳的引數通過在原有裝飾器函式的基礎上再套一層函式來實現的

現在裝飾器函式最外層的作用只是在這個巢狀函式結構的空間裡引入了乙個新的區域性變數,且變數的值由外部傳入

此時多了一層函式巢狀,由於每乙個函式名加上括號就是一層呼叫,因此要把@和@後面分開成兩部分看,每乙個函式名加上括號就是一層呼叫,因此要把@和@後面分開成兩部分看

import

time

flage =false

deftimmer_out(flag):

deftimmer(func):

def inner(*args,**kwargs):

ifflag:

start =time.time()

ret = func(*args,**kwargs)

end =time.time()

print(end-start)

return

ret

else

: ret = func(*args, **kwargs)

return

ret

return

inner

return

timmer

#timmer = timmer_out(flage)

@timmer_out(flage) #

wahaha = timmer(wahaha)

defwahaha():

time.sleep(0.1)

print('

wahahahahahaha')

@timmer_out(flage)

deferguotou():

time.sleep(0.1)

print('

erguotoutoutou')

wahaha()

erguotou()

在inner前加裝飾器@wraps(func)就不影響原函式名的使用,但是需要從functools模組引入這個函式

如果是一層裝飾器函式,則在外面取執行的函式名不是應有的本名,得到的是裝飾器內部的'inner

2.多個裝飾器裝飾同乙個函式

上面乙個

下面乙個

先執行上面的前,再下前,再下後,再上後

套娃執行結構,上面的在最外一圈。

原理:真實的執行順序是必須先最近的裝飾器函式,最近的裝飾器函式把函式名傳進來,返回值作為遠的裝飾器的引數進行執行.

執行效果如下圖

可以記錄使用者的登陸情況,又計算執行時間,但是必須兩件事執行順序的邏輯必須明確。

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...