【问题标题】:Can @property be used to return a value if it exists, but to set the value if it does not yet exist?@property 是否可以用于返回一个值(如果它存在),但如果它不存在则设置该值?
【发布时间】:2021-11-20 00:32:55
【问题描述】:

我想要一个仅用于访问只读数据的类。如果从类请求数据但尚不存在,我希望类处理获取数据。我只是想知道以下代码是否有意义;你能看出这有什么潜在的问题吗?

class Data:

    @property
    def some_data(self):
        if hasattr(Data, "_some_data"):
            return Data._some_data
        else:
            Data._some_data = function_that_gets_data()
            return Data._some_data

    # other definitions for more data go here ...


D = Data()

# access data
print(D.some_data)

【问题讨论】:

  • 您可以使用属性进行延迟初始化。您使用实例的属性来初始化并获取类属性有点奇怪。
  • 你是想问如何让一个类属性成为一个属性?有关最新答案,请参阅 stackoverflow.com/a/64738850/3001761
  • 您希望缓存数据的范围是实例还是类?
  • 你是什么意思@khelwood?你是指我如何使用例如Data._some_data 在课堂上,而不是 self._some_data?
  • 那么你也可以使用functools.cached_property

标签: python properties


【解决方案1】:

我基本上在我的代码库中做同样的事情,它对我来说效果很好,这是一种缓存信息的好方法。

class ItemBase(BaseClass):
  _soup = None

  @property
  def soup(self):
    if not self._soup:
      self._soup = get_info()
    return self._soup

【讨论】:

  • 我想改变的一件事就是不要使用例如。 if not self._soup:,使用if self._soup is None:。这样,如果 _soup 是布尔值并设置为 False,您就可以避免出现问题。
  • @Spaterman - 你是一个美丽的人,这很好。
猜你喜欢
  • 2023-03-13
  • 2018-04-10
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2018-05-26
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多