我有以下代码: 装饰者:
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)
是否可以像第一种方式那样做?我不明白为什么我应该在已经提供类实例时将其作为参数。
答案 0 :(得分:1)
ClassInstance.ClassMethod._original
是一个未绑定到任何类实例的函数。
请注意,当通过类实例(例如,使用点引用)访问函数对象时,会发生从函数到方法的转换。但是,_original
仅绑定到另一个函数对象wrapper
(在运行时提升为绑定方法)而不是类实例。因此不传递隐式self
参数。你必须明确传递它。
ClassInstance.ClassMethod._original
^
|- instance ^
|- method
^
|- function object bound to method
我不明白为什么我应该把类实例作为参数 什么时候提供
不,它尚未提供。