【发布时间】:2021-10-02 14:27:09
【问题描述】:
我正在实现一个带有内部存储器的 python 装饰器(由下面的counter 表示)。
装饰器变量在dataclass 的实例之间共享,而对于公共class 的实例则不同。
为什么会这样?除了检查f 是否属于某个类以及如果是,该类是否为dataclass 之外,是否有更清洁/更简单的解决方案?
import dataclasses
def decorator(f):
counter = {}
def wrapper(*args, **kwargs):
key = repr([f.__name__, args, kwargs])
counter[key] = counter.setdefault(key, 0)+1
result = f(*args, **kwargs)
print(f"{counter[key]}", end=" ")
return result
return wrapper
@dataclasses.dataclass
class D:
@decorator
def foo(self):
pass
class C:
@decorator
def foo(self):
pass
尽管C 和D 非常相似,但下面的代码显示普通object 的实例每个都有不同的counter:
>>> for i in range(5):
... c = C()
... c.foo()
1 1 1 1 1
当使用 dataclass 时,counter 是共享的:
>>> for i in range(5):
... c = D()
... c.foo()
1 2 3 4 5
【问题讨论】:
标签: python python-3.x python-decorators python-dataclasses