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

3 投票
1 回答
740 浏览
提问于 2025-04-16 21:56

我想把这里描述的计时装饰器应用到一个类里的方法上,而不是单独的方法。请问应该怎么做呢?

我遇到了这个错误:

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

1 个回答

1

编辑

感谢你的评论,我想我明白问题出在哪里了。这个代码不行:

class A:

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

A.a(2)

原因正如你所说的那样。出现了这个错误:

TypeError: unbound method wrapper() 必须用 A 类的实例作为第一个参数(结果却得到了一个 int 实例)

但是这个代码可以:

class A:

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

A.a(2)

所以,顺序很重要。我觉得这里发生的事情是,它搞混了 Python 处理绑定方法的方式:当 Python 查看成员 a 时,它必须做出一个决定:

  1. 创建一个绑定方法
  2. 创建一个类方法
  3. 什么都不做(保持原样)

如果它得到的是一个普通函数,它会选择(1),而 @timings 产生的就是一个普通函数。

这样解决问题了吗?

撰写回答