gpt4 book ai didi

python - 修饰后的原始类方法的使用需要对象实例作为参数

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:12 25 4
gpt4 key购买 nike

我有以下代码:一个装饰器:

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)

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

最佳答案

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

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

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

I do not understand why I should put the class instance as a parameter when it is already provided

不,尚未提供。

关于python - 修饰后的原始类方法的使用需要对象实例作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45923185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com