Functools.update_wrapper()无法正常工作

时间:2014-09-22 11:47:33

标签: python python-2.7 decorator python-decorators functools

我在装饰器中使用Functools.update_wrapper(),但似乎update_wrapper仅重写函数属性(例如__doc____name__),但不会影响help() 1}}功能。

我知道these answers,但他们不使用装饰器类。

这是我的功能。

import functools

class memoized(object):

    def __init__(self, func):
        self.func = func
        functools.update_wrapper(self, func)

    def __call__(self, *args):
        self.func(*args)

@memoized 
def printer(arg):
    "This is my function"
    print arg

这是输出

>>> printer.__doc__
This is my function

>>> help(printer)
Help on memoized in module __main__ object:

printer = class memoized(__builtin__.object)
 |  Methods defined here:
 |  
 |  __call__(self, *args)
 |  
 |  __init__(self, func)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

它看起来像一个错误,但我该如何解决?

1 个答案:

答案 0 :(得分:12)

functools.update_wrapper()在实例上设置属性,但help()查看类型上的信息。

因此printer.__doc__为您提供了实例属性,help()打印了有关type(printer)的信息,例如memoized类,它没有__doc__属性。

这不是一个错误,这完全是设计的; help() will always look at the class when you pass in an instance。如果您希望help()适用于修饰函数,请不要使用类作为装饰器。