我在一个类中有一些属性方法,我想在某个时候清除此属性的缓存。
示例:
class Test():
def __init__(self):
pass
@property
@functools.lru_cache()
def prop(self):
# Compute some stuffs and return complex number
如果我执行self.prop.clear_cache(),则出现以下错误消息:
AttributeError: 'numpy.complex128' object has no attribute 'cache_clear'
clear_cache()适用于函数,但不适用于属性方法。有什么办法吗?
答案 0 :(得分:4)
您需要访问属性对象的getter属性上的缓存属性,因此为.fget
。您只能在类上访问属性对象 :
Test.prop.fget.cache_clear()
这是因为@property
装饰器用属性实例替换了LRU缓存中的prop
函数对象。
访问实例上的属性名称将始终为您提供属性获取器的结果,而不是带缓存控件的函数对象。
演示:
>>> import functools
>>> class Foo:
... @property
... @functools.lru_cache()
... def bar(self):
... print("Accessing the bar property")
... return 42
...
>>> f = Foo()
>>> f.bar
Accessing the bar property
42
>>> f.bar # cached
42
>>> Foo.bar.fget.cache_clear()
>>> f.bar
Accessing the bar property
42
请注意,以这种方式使用LRU缓存意味着该缓存存储在该类的所有实例之间共享,并且每个实例存储有单独的结果(缓存在self
参数上键入)。清除缓存将清除所有实例。给定默认的maxsize=128
配置,这意味着将仅缓存最近使用的128个实例的属性值。访问实例#129上的属性,然后再次访问实例#1将意味着重新计算#1的值,因为该实例的属性值将被逐出。