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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有一种简单的方法可以在对象级别上记住(和刷新)Python上的属性?相关的知识,希望对你有一定的参考价值。

我正在寻找一种缓存对象属性的方法。就我而言,我认为对象可以随时间变化,因此该属性的备注值应可刷新。在纯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".

以上是关于是否有一种简单的方法可以在对象级别上记住(和刷新)Python上的属性?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种简单的方法来检查 Ruby IO 实例是否会在 read() 上阻塞?

在调用Web服务时,是否有一种简单的方法可以获取请求的soap消息和响应的soap消息?

是否有一种在JavaScript ES6中初始化数组的功能方法?

是否有一种简单的方法可以在烧瓶中使会话超时?

是否有一种无头的方式来导入项目和刷新工作区?

是否有一种标准方法可以向您的 Web API 验证应用程序?