Python裝飾器如何實現修復過程解析
阿新 • • 發佈:2020-09-08
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,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__變數也是一樣。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。