您好,登錄后才能下訂單哦!
使用Python裝飾器實現修復的方法?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
Python裝飾器(decorator)在實現的時候,被裝飾后的函數其實已經是另外一個函數了(函數名等函數屬性會發生改變),
為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現之前加上functools的wrap,
它能保留原有函數的名稱和docstring。
未加@wraps的時候:
from functools import wraps def wrapper(func): # @wraps(func) def inner(*args, **kwargs): print("裝飾器工作中...") func(*args, **kwargs) return inner @wrapper def f1(arg): """ 這是一個測試裝飾器修復技術的函數 :param arg: 隨便傳 :return: 沒有 """ print(arg) f1('呵呵') print(f1.__name__,f1.__doc__)
打印結果是:
但是加上@wraps以后:
from functools import wraps def wrapper(func): @wraps(func) def inner(*args, **kwargs): print("裝飾器工作中...") func(*args, **kwargs) return inner @wrapper def f1(arg): """ 這是一個測試裝飾器修復技術的函數 :param arg: 隨便傳 :return: 沒有 """ print(arg) f1('呵呵') print(f1.__name__,f1.__doc__)
打印結果是:
其中主要的就是兩個變量:
1、顯示 正在執行的函數的名稱 f.name
2、顯示 正在執行的函數的注釋 f.doc
簡單來說就是:
如果沒使用@wraps,當A調用了裝飾器B的話,即使A.name,返回的會是裝飾器B的函數名稱,而不是A的函數名稱
如果使用了@wraps,當A調用了裝飾器B的話,A.__ name__返回的會是A函數的名稱,而不是飾器B的名稱,
這也即使常說的@wraps是裝飾器的修復技術,
實際就是修復還原了A的__ name__變量,同理__ doc__變量也是一樣。
看完上述內容,你們掌握使用Python裝飾器實現修復的方法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。