Python
324 浏览 5 years, 9 months
10.4 装饰器的副作用及如何弥补
版权声明: 转载请注明出处 http://www.codingsoho.com/装饰器的副作用及如何弥补
装饰器的副作用
Foo经过装饰之后名字还是Foo,但它已经不是真正的最原始的Foo了,它只是wrapper的一个别名。help(Foo)
显示的并不正确
Help(Foo)
将显示的是Foo(也就是wrapper)的定义
如何弥补
给wrapper添加wrapped拥有的一些属性
覆盖
- __module__
- __name__
- __qualname__
- __doc__
- __annotations__
更新
- __dict__
functools.wraps functools.wraps
的作用是将原函数对象的指定属性复制给包装函数对象, 默认有 module、name、doc,或者通过参数选择。代码如下:
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print 'call %s():' % func.__name__
return func(*args, **kwargs)
return wrapper
@log
def now():
print('2015-3-25')
如果不加@functools.wraps(func)
>>> now.__name__
'wrapper'
加了之后,原来的属性保持了
>>> now.__name__
'now'