【发布时间】:2019-11-16 04:34:58
【问题描述】:
我希望类中的函数将它们的返回值存储在某种数据结构中。为此,我想使用装饰器:
results = []
instances = []
class A:
def __init__(self, data):
self.data = data
@decorator
def f1(self, a, b):
return self.data + a + b
@decorator
def f2(self, a):
return self.data + a + 1
x = A(1)
x.f1(1, 2)
x.f2(3)
print(results)
问题是,如何实现这个装饰器。
主要思路如下:
class Wrapper:
def __init__(self, func):
self.func = func
def __call__(self, *args):
res = self.func(*args)
results.append(res)
instances.append(args[0])
def decorator(func):
return Wrapper(func)
然后我收到一条错误消息:
TypeError: f1() missing 1 required positional argument: 'b'
这个问题和其他人问的很相似(How to decorate a method inside a class?,Python functools.wraps equivalent for classes),但不清楚在我的情况下应该把@functools.wraps放在哪里或者打电话给@functools.update_wrapped()。
【问题讨论】:
-
我有点不清楚是否需要特定于类或特定于实例的存储。例如,如果您有 2 个
A实例,我们称它们为x和y,您是否希望它们写入同一个列表? -
我的问题是所有实例写入同一个列表的方式。实际上,我对注册类实例也更感兴趣。我更新了我的问题。
标签: python decorator python-decorators callable