有没有一种简单的方法可以在对象级别记忆(和刷新)Python上的属性?

有没有一种简单的方法可以在对象级别记忆(和刷新)Python上的属性?,python,caching,memoization,Python,Caching,Memoization,我正在寻找一种缓存对象属性的方法。在我的例子中,我假设对象可以随时间变化,因此属性的记忆值应该是可流动的。在纯python中,我希望有如下行为: Foo类: 定义初始化(self,文本:str): self.\u text=文本 自。_bar=无 def冲洗(自): 自。_bar=无 def更新_文本(self,文本:str): self.\u text=文本 self.flush() @财产 def bar(自): 如果self.\u栏为无: 打印('计算栏…') self.\u bar=f'

我正在寻找一种缓存对象属性的方法。在我的例子中,我假设对象可以随时间变化,因此属性的记忆值应该是可流动的。在纯python中,我希望有如下行为:

Foo类:
定义初始化(self,文本:str):
self.\u text=文本
自。_bar=无
def冲洗(自):
自。_bar=无
def更新_文本(self,文本:str):
self.\u text=文本
self.flush()
@财产
def bar(自):
如果self.\u栏为无:
打印('计算栏…')
self.\u bar=f'用“{self.\u text}”计算”
返回自我
foo1=Foo(“狗”)
foo2=Foo(‘鱼’)
打印(foo1.bar)
#计算棒。。。
#用“狗”计算。
打印(foo1.bar)
#用“狗”计算。
打印(foo2.bar)
#计算棒。。。
#用“鱼”计算。
打印(foo2.bar)
#用“鱼”计算。
foo1.更新_文本(“Cat”)
打印(foo1.bar)
#计算棒。。。
#使用“Cat”进行计算。
打印(foo1.bar)
#使用“Cat”进行计算。
打印(foo2.bar)
#用“鱼”计算。
然后,如您所见,我想缓存
Foo.bar
属性。我的方法是将私有财产定义为
None
,然后分配和刷新,以获得一个记忆行为

现在,我的问题是,是否有某种方法、库、方法或技术可以在不需要私有属性的情况下获得这种行为(假设您在类中有可记忆属性)。

我正在阅读标准库()中的
@lru\u cache()
装饰器(以及最新的
@cached\u属性
),但我意识到
cache\u clear()
方法会删除该类所有实例的已记忆值


我在想一个可能的解决方案是使用不可变对象,但这个解决方案并不是我想要的,因为可能会出现我只想刷新其中一个属性备忘录的情况。

感谢@sanyash对问题注释的讨论。

有一个
cached_属性
package()提供请求的行为。使用
cached_属性的示例如下所示:

从缓存的\u属性导入缓存的\u属性
Foo类:
定义初始化(self,文本:str):
self.\u text=文本
def冲洗(自):
del self._dict___['bar']
def更新_文本(self,文本:str):
self.\u text=文本
self.flush()
@缓存的不动产
def bar(自):
打印('计算栏…')
返回带有“{self.\u text}”的f'计算”
foo1=Foo(“狗”)
foo2=Foo(‘鱼’)
打印(foo1.bar)
#计算棒。。。
#用“狗”计算。
打印(foo1.bar)
#用“狗”计算。
打印(foo2.bar)
#计算棒。。。
#用“鱼”计算。
打印(foo2.bar)
#用“鱼”计算。
foo1.更新_文本(“Cat”)
打印(foo1.bar)
#计算棒。。。
#使用“Cat”进行计算。
打印(foo1.bar)
#使用“Cat”进行计算。
打印(foo2.bar)
#用“鱼”计算。

缓存的\u属性
是缓存属性的完美解决方案

如果您对函数有类似的关注,那么它适用于每个实例

导入方法工具
Foo类:
@methodtools.lru\u缓存(maxsize=128)
def栏(自身、a、b、c):
使用参数返回某物

属性几乎总是建立在私有属性上。是的,但是当我发现
@cached_属性
decorator时,我意识到在不需要私有属性的情况下获得相同的行为会非常有趣。:)为什么
cached\u属性
不能满足您的需求?另外,我们讨论的是相同的
cached\u属性
实现吗?我在这里找到了一个:尽管如此,您使用pypi.org/project/cached-property的建议还是如预期的那样有效。缓存处于实例和方法级别,因此这对我来说是正确的答案。=)