如何将Python时序装饰器应用于类中的方法

时间:2011-07-20 15:31:09

标签: python decorator timing

我正在尝试将here描述的时序装饰器应用于类中的方法而不是独立方法。该怎么做?

我收到此错误:

TypeError: unbound method wrapper() must be called with SomeClass instance as
first argument (got float instance instead)

1 个答案:

答案 0 :(得分:1)

修改

感谢您的评论,我想我知道问题是什么。这不起作用:

class A:

    @timings
    @classmethod
    def a(cls, x):
       print(x)

A.a(2)

正是因为你说的原因。     TypeError:必须使用A实例作为第一个参数调用unbound方法wrapper()(改为使用int实例)

但这样做:

class A:

    @classmethod
    @timings
    def a(cls, x):
        print(x)

A.a(2)

所以顺序很重要。我认为这里发生的事情是愚弄python处理绑定方法的方式:当python查看成员a时,它必须做出决定:

  1. 制定约束方法
  2. 制作课程方法
  3. 什么都不做(保持原样)
  4. 如果它获得常规函数,它将执行(1),并且@timings生成常规函数。

    这是否解决了这个问题?