在装饰后使用原始类方法需要将对象实例作为参数

时间:2017-08-28 16:08:10

标签: python python-decorators

我有以下代码: 装饰者:

def pyDecorator(func):
    print func
    @wraps(func)
    def wrapped(*args, **kwargs):
        print args
        print kwargs
        tBegin = time()
        result = func(*args, **kwargs)
        tEnd = time()
        if result:
            # UI update
            print("\nTBegin '{}'({} s)".format(func.__name__,  tBegin))
            # UI and report update
            print("TEnd '{}' ({} s) ({} s) Result:{}".format(func.__name__, tEnd,tEnd - tBegin, result))  
        return result
    #workarround to use the original function
    wrapped._original=func 
    return wrapped 

一个装饰类方法:

class Dummy(object): 
    @pyDecorator
    def ClassMethod(self):
        print "Original class code executed"
        return True

如果我按以下方式调用原始函数的方法,则会收到此错误"TypeError: ClassMethod() takes exactly 1 argument (0 given):"

ClassInstance.ClassMethod._original()

所以我被迫使用以下电话:

ClassInstance.ClassMethod._original(ClassInstance)

是否可以像第一种方式那样做?我不明白为什么我应该在已经提供类实例时将其作为参数。

1 个答案:

答案 0 :(得分:1)

ClassInstance.ClassMethod._original是一个未绑定到任何类实例的函数。

请注意,当通过类实例(例如,使用点引用)访问函数对象时,会发生从函数到方法的转换。但是,_original仅绑定到另一个函数对象wrapper(在运行时提升为绑定方法)而不是类实例。因此不传递隐式self参数。你必须明确传递它。

ClassInstance.ClassMethod._original
^
|- instance   ^           
              |- method
                          ^
                          |- function object bound to method
  

我不明白为什么我应该把类实例作为参数   什么时候提供

不,它尚未提供。