如何将Python计时修饰符应用于类中的方法
我试图将所描述的计时装饰器应用于类中的方法,而不是独立的方法。如何做到这一点 我得到这个错误: TypeError: unbound method wrapper() must be called with SomeClass instance as first argument (got float instance instead) TypeError:必须使用SomeClass实例作为调用未绑定的方法包装器() 第一个参数(取而代之的是float实例) 编辑 多亏了你的评论,我想我知道问题出在哪里了。这不起作用:如何将Python计时修饰符应用于类中的方法,python,decorator,timing,Python,Decorator,Timing,我试图将所描述的计时装饰器应用于类中的方法,而不是独立的方法。如何做到这一点 我得到这个错误: TypeError: unbound method wrapper() must be called with SomeClass instance as first argument (got float instance instead) TypeError:必须使用SomeClass实例作为调用未绑定的方法包装器() 第一个参数(取而代之的是float实例) 编辑 多亏了你的评论,我想我知道问题
class A:
@timings
@classmethod
def a(cls, x):
print(x)
A.a(2)
正是因为你说的原因。
TypeError:必须使用实例作为第一个参数调用未绑定的方法包装器()(改为使用int实例)
但这确实:
class A:
@classmethod
@timings
def a(cls, x):
print(x)
A.a(2)
所以顺序很重要。我认为这是在愚弄python处理绑定方法的方式:当python查看成员a时,它必须做出决定:
这能解决问题吗?你试过了吗?都一样。函数和方法没有什么不同。@agf:不幸的是,两者之间存在差异,尽管这不是由函数/方法本身引起的,而是由于类拒绝将非函数转换为instancemethods(带有描述符和其他内容)。但它不应该在这里应用,因为实际的包装器本身就是函数。@delnan我不确定我是否理解。你是说如果装饰程序返回的不是函数,它就不能工作了?@agf:是的。请看,我现在尝试的方法是classmethod。噢!那样的话,我想我知道可能是什么。我编辑了我的答案:还有更好的吗?如果我改变顺序,在计时修饰符上方的一行使用classmethod修饰符,我会得到“TypeError:只能对方法描述符或实例方法调用类级别的classmethod()。@Alex van Houten:那样的话,我就被难倒了。我知道你可能不再关心这个问题了,但我非常好奇这个问题是什么,所以如果你发布一些代码,它可能会变得很明显。我想你解决了它。假设utilities.py有Timing类,那么这个脚本,我称之为Timing_classmethod.py,可以工作:“从utilities导入时间Timing timings=Timing()类sleep:ough_sleep=1.0 at classmethod at timings(at=@)def sleepytime(cls,somestring):time.sleep(cls.ough_sleep)打印somestring sleep.sleepytime('done')print timings“然而,我正在编译Cython版本,Timing_classmethod.pyx,这给出了上面的错误消息。所以这是一个Cython的东西,在最新的版本中可能解决,也可能解决不了。