Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python计时修饰符应用于类中的方法_Python_Decorator_Timing - Fatal编程技术网

如何将Python计时修饰符应用于类中的方法

如何将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实例) 编辑 多亏了你的评论,我想我知道问题

我试图将所描述的计时装饰器应用于类中的方法,而不是独立的方法。如何做到这一点

我得到这个错误:

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时,它必须做出决定:

  • 定界法
  • 制作一个类方法
  • 什么也不做(保持原样)
  • 如果它得到一个正则函数,它将执行(1),并且@timings生成一个正则函数


    这能解决问题吗?

    你试过了吗?都一样。函数和方法没有什么不同。@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的东西,在最新的版本中可能解决,也可能解决不了。