消除裝飾器對原函式的屬性影響

2022-09-06 12:45:22 字數 1418 閱讀 5900

import

osdef

decor(func):

def with_decor(*args, **kwargs):  #這裡內部巢狀函式使原函式引數能順利傳遞

func(*args, **kwargs)  #func_a 會在這裡被呼叫

a =args

print

(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 其實所有的 語法糖,都可以像 中注釋的那樣等於 類的裝飾...