在我們使用了裝飾器函數之后,我們的被裝飾函數默認指向了裝飾器的名字(內存地址)
如:
def wrapper(func): # func = holiday def inner(*args, **kwargs): print('在被裝飾的函數執行之前做的事') ret = func(*args, **kwargs) print('在被裝飾的函數執行之后做的事') return ret return inner @wrapper #holiday = wrapper(holiday) def holiday(day): ''' 這是一個放假通知 ''' print('全體放假%s天'%day) return '好開心' print(holiday.__name__)
print(holiday.__doc__)
該實例運行結果為: inner
我是inner函數的注釋
上述例子中:holiday()函數為被裝飾的函數,其實際內存地址指向了inner()裝飾函數。也就是說如果我們想打印holiday()函數的名字、注釋等,實際打印的是inner()函數的函數名、注釋
那么怎么打印holiday()函數的名字跟注釋等方法呢?
這時候我們就用到另一個內置的裝飾器:wraps
如:
from functools import wraps def wrapper(func): # func = holiday @wraps(func) def inner(*args, **kwargs): print('在被裝飾的函數執行之前做的事') ret = func(*args, **kwargs) print('在被裝飾的函數執行之后做的事') return ret return inner @wrapper # holiday = wrapper(holiday) def holiday(day): ''' 這是一個放假通知 ''' print('全體放假%s天'%day) return '好開心' print(holiday.__name__) print(holiday.__doc__)
該實例運行結果為: holiday
這是一個放假通知
我們引入了內置functools模塊中的裝飾器wraps,這時候就可以正常打印被裝飾函數的名字、注釋等方法了。