Python裝飾器(decorator)在實現(xiàn)的時候,有一些細節(jié)需要被注意。例如,被裝飾后的函數(shù)其實已經(jīng)是另外一個函數(shù)了(函數(shù)名等函數(shù)屬性會發(fā)生改變)。這樣有時候會對程序造成一些不便,例如筆者想對unittest框架中的一些函數(shù)添加自定義的decorator,添加后由于函數(shù)名和函數(shù)的doc發(fā)生了改變,對測試結果有一些影響。
所以,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現(xiàn)之前加上functools的wrap,它能保留原有函數(shù)的名稱和docstring。例如:
test_decorator.py |
#-*-coding=utf-8-*-
fromfunctoolsimportwraps
defmy_decorator(func):
@wraps(func)
defwrapper(*args,**kwargs):
print('Callingdecoratedfunction...')
returnfunc(*args,**kwargs)
returnwrapper@my_decorator
defexample():
"""Docstring"""
print('Calledexamplefunction')
print(example.__name__,example.__doc__)
打印出:exampleDocstring
愛華網(wǎng)



