8

Functools.update_wrapper()在我的装饰器中使用,但似乎update_wrapper只重写了函数属性(例如__doc__, __name__),但不影响help()函数。

我知道这些答案,但它们不适用于装饰类。

这是我的功能。

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)

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

4

1 回答 1

13

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

所以printer.__doc__给你实例属性,help()打印有关的信息type(printer),例如memoized没有__doc__属性的类。

这不是错误,这都是设计使然;help()当您传入一个实例时,将始终查看该类help()如果您想为装饰功能工作,请不要使用类作为装饰器。

于 2014-09-22T11:50:35.350 回答