Python


224 浏览 5 years, 2 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'