我正在寻找一种缓存对象属性的方法。就我而言,我认为对象可以随时间变化,因此该属性的备注值应可刷新。在纯python中,我想要具有以下行为:
class Foo:
def __init__(self, text: str):
self._text = text
self._bar = None
def flush(self):
self._bar = None
def update_text(self, text: str):
self._text = text
self.flush()
@property
def bar(self):
if self._bar is None:
print('Computing bar...')
self._bar = f'Computation with "{self._text}".'
return self._bar
foo1 = Foo('Dog')
foo2 = Foo('Fish')
print(foo1.bar)
# Computing bar...
# Computation with "Dog".
print(foo1.bar)
# Computation with "Dog".
print(foo2.bar)
# Computing bar...
# Computation with "Fish".
print(foo2.bar)
# Computation with "Fish".
foo1.update_text('Cat')
print(foo1.bar)
# Computing bar...
# Computation with "Cat".
print(foo1.bar)
# Computation with "Cat".
print(foo2.bar)
# Computation with "Fish".
然后,正如您所看到的,我想缓存Foo.bar
属性。我的方法是定义一个私有属性,将其初始化为None
,然后进行分配和刷新以获取记录的行为。
现在,我的问题是,是否有某种方法,库,方法或技术可以在无需拥有私有属性的情况下获得此行为(假设您在类中倾向于记忆的属性)。
[我正在从标准库(@lru_cache()
)中阅读@cached_property
装饰器(以及最新的https://docs.python.org/3/library/functools.html),但是我意识到cache_clear()
方法删除了该类所有实例的备注值。
我曾想过一种可能的解决方案可能是使用不可变对象,但是这种解决方案并不是我想要的,因为在某些情况下,我只想刷新属性备注之一。
感谢@sanyash对问题评论的讨论。
有一个cached_property
程序包(https://pypi.org/project/cached-property/)提供所请求的行为。使用cached_property
的示例如下:
from cached_property import cached_property
class Foo:
def __init__(self, text: str):
self._text = text
def flush(self):
del self.__dict__['bar']
def update_text(self, text: str):
self._text = text
self.flush()
@cached_property
def bar(self):
print('Computing bar...')
return f'Computation with "{self._text}".'
foo1 = Foo('Dog')
foo2 = Foo('Fish')
print(foo1.bar)
# Computing bar...
# Computation with "Dog".
print(foo1.bar)
# Computation with "Dog".
print(foo2.bar)
# Computing bar...
# Computation with "Fish".
print(foo2.bar)
# Computation with "Fish".
foo1.update_text('Cat')
print(foo1.bar)
# Computing bar...
# Computation with "Cat".
print(foo1.bar)
# Computation with "Cat".
print(foo2.bar)
# Computation with "Fish".