如何将Python计时器装饰器应用于类中的方法
我想把这里描述的计时装饰器应用到一个类里的方法上,而不是单独的方法。请问应该怎么做呢?
我遇到了这个错误:
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),而 @timings 产生的就是一个普通函数。
这样解决问题了吗?