清除@property方法python的缓存

时间:2019-04-03 14:17:32

标签: python python-3.x

我在一个类中有一些属性方法,我想在某个时候清除此属性的缓存。

示例:

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()适用于函数,但不适用于属性方法。有什么办法吗?

1 个答案:

答案 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的值,因为该实例的属性值将被逐出。