我很难找到这个问题的解决方案。每当我们装饰类的方法时,该方法还没有绑定到任何实例,所以说我们有:
from functools import wraps
def decorator(f):
closure_variable = 0
@wraps(f)
def wrapper(*args, **kwargs):
nonlocal closure_variable
closure_variable += 1
print(closure_variable)
f(*args, **kwargs)
return
return wrapper
class ClassA:
@decorator
def decorated_method(self):
pass
这导致了一些有趣的事情,即 的所有实例ClassA
都绑定到相同的闭包环境。
inst1 = ClassA()
inst2 = ClassA()
inst3 = ClassA()
inst1.decorated_method()
inst2.decorated_method()
inst3.decorated_method()
上面几行将输出:
1
2
3
现在,对于我手头的问题,我创建了一个装饰器,它缓存一个令牌,并且仅在令牌过期后请求一个新令牌。该装饰器应用于名为 的类的方法TokenSupplier
。我意识到这种行为,我显然不希望这种情况发生,我可以解决这个问题并保留装饰器设计模式吗?
我想过在闭包环境中存储字典并使用实例哈希来索引所需的数据,但我相信我可能只是错过了一些更基本的东西。我的目标是让每个实例都有自己的闭包环境,但仍然能够使用装饰器模式来装饰不同的未来TokenSupplier
实现。
先感谢您!
为了避免在所有实例之间共享缓存(这可能不是必需的或不希望的),最好为每个实例都有一个带有过期时间等的缓存。换句话说,我们不需要有一个“单一来源”所有实例的缓存”。
在下面的实现中,类的每个实例都会初始化自己的缓存
dict()
来存储令牌、其过期时间和其他相关信息,这将为您提供完全的控制权。印刷