当学习python cookbook的类装饰器的时候,遇到如下的例子:
代码语言:javascript复制import types
from functools import wraps
class Profiled:
def __init__(self, func):
wraps(func)(self)
self.ncalls = 0
def __call__(self, *args, **kwargs):
self.ncalls = 1
return self.__wrapped__(*args, **kwargs)
def __get__(self, instance, cls):
if instance is None:
return self
else:
return types.MethodType(self, instance)
@Profiled
def add(x, y):
return x y
class Spam:
@Profiled
def bar(self, x):
print(self, x)
# Example
add(2, 3)
add(4, 6)
add.ncalls
s = Spam()
s.bar(1)
s.bar(2)
s.bar(3)
s.bar.ncalls
当测试例子的时候(例如,add(2, 3)), 会报错(AttributeError: 'Profiled' object has no attribute 'wraps')。 原因是 要先import functools, 再from functools import wraps。 究其原因,可能是functools 有 wraps所需要的某些依赖,缺少functools 可能就找不到wraps了。