import該程式將會輸出:osdef
decor(func):
def with_decor(*args, **kwargs): #這裡內部巢狀函式使原函式引數能順利傳遞
func(*args, **kwargs) #func_a 會在這裡被呼叫
a =args
(a)
print('
call decor')
return
with_decor
@decor
def func_a(*args, **kwargs):
print('
call a')
func_a(1,2,3)
os.system(
"pause
")
呼叫 func_a 函式會執行直接裝飾器裡的內容,並將引數傳入閉包
python裝飾器會使原函式的屬性被改變,比如func.__name__
這裡新增一行 print(func_a.__name__) 來展示影響
輸出效果:
可以看到原函式 func_a 的名字變成了裝飾器裡面的函式 with_decor 的名字
這導致一些特殊場合要用到這些屬性時不方便,比如在 robot framework 自動化測試框架中呼叫函式,函式被裝飾後就不能被正常呼叫
import輸出:osfrom functools import
wraps
defdecor(func):
@wraps(func)
def with_decor(*args, **kwargs):
return func(*args, **kwargs)
return
with_decor
@decor
def func_a(*args, **kwargs):
print('
call a')
func_a(1,2,3)
print(func_a.__name__
)os.system(
"pause
")
可以看到原函式的屬性沒有被改變
wraps 的作用可以理解為消除裝飾器的影響
物件導向 屬性 裝飾器函式 property
屬性的初識屬性 裝飾器函式,內建函式,幫助你將類種的方法偽裝成屬性,特性。上沒有什麼提公升,只是更合理.property 呼叫方法的時候不需要主動加括號,讓程式的邏輯性更合理.屬性名.setter 裝飾器,修改被property裝飾的屬性的時候會呼叫被這個裝飾器裝飾的方法,除了self之外還有乙個引...
如何實現屬性可修改的函式裝飾器?
需求 在某專案中,程式執行效率較差,為分析程式內哪些函式的執行開銷較大,我們實現了乙個 帶timeout引數的函式裝飾器,裝飾功能如下 warn timeout 1.5 def func a,b 1 統計被裝飾函式的單次呼叫執行時間 2.時間大於引數timeout的,將此次函式呼叫記錄到log日誌中...
函式裝飾器與類的裝飾器
先說函式的裝飾器,如下 1 defzhuang func 2print 3return func 高階函式45 6 zhuang 相當於是test zhuang test 7def test 8print 910 test view code 其實所有的 語法糖,都可以像 中注釋的那樣等於 類的裝飾...