gpt4 book ai didi

python - 如何初始化从Python类中的其他属性计算得到的属性

转载 作者:行者123 更新时间:2023-12-03 08:45:01 25 4
gpt4 key购买 nike

我在一个类中有一个属性,我想根据其他属性计算该属性。

我希望此属性是私有(private)的,因此我想将其设为属性。

我知道仍然需要在类的 init block 中调用属性,但是我没有找到一种优雅的方式来编写它。

一些丑陋的代码可以满足我的需要:

class ABC:
def __init__(self, t=0):
self.attrA = t
self._attrB = None

@property
def attrB(self):
return self._attrB

@attrB.setter
def attrB(self, value):
self._attrB = 2*self.attrA

obj = ABC(10)
print(obj.attrB)

问题:如何避免在 init 中使用虚拟“None”值声明 attrB?

编辑上一篇文章:

  • 理想情况下,我希望 attrB 真正成为一个“存储”属性(而不仅仅是属性 getter ),这样每次调用它时就不会重新计算:在我的用例中 attrA 和 attrB 是长列表,因此需要重新计算attrB 每次被调用都是不行的

  • 我知道缓存属性调用也是一种选择,但是通过拥有真实的属性是否没有更简单的方法?

最佳答案

您根本不需要 self._attrB attrB.setter,因为您的 attrB code> getter 可以返回您想要的 attrB 值(在本例中它是 attrA 值的两倍):

class ABC:
def __init__(self, t=0):
self.attrA = t

@property
def attrB(self):
return 2 * self.attrA

obj = ABC(10)
print(obj.attrB)

一个很好的线索表明您的 attrB setter 是不必要的,因为它忽略了您传递给它的 value!将此逻辑放入 getter 中会更简单,因为它不依赖于尚未存储在类中的任何数据。

(编辑)如果您用来生成 attrB 的逻辑更复杂,您可以像这样缓存它:

from functools import lru_cache

class ABC:
def __init__(self, t=0):
self.attrA = t

@property
def attrB(self):
return self._attrB(self.attrA)

@lru_cache
def _attrB(self, attrA):
return 2 * self.attrA

@lru_cache会根据attrA的值缓存_attrB的返回值,因此如果attrA会重新计算 已更改,否则从缓存中提供值。

如果您不希望在 attrA 更改时更改 attrB,那么您可以简单地使用 cached_property,它首先计算值当您访问它并随后使用缓存副本时:

from functools import cached_property

class ABC:
def __init__(self, t=0):
self.attrA = t

@cached_property
def attrB(self):
return 2 * self.attrA

显然,如果您不希望 attrA 本身在初始化后发生更改,则可以将其设为私有(private)变量。

关于python - 如何初始化从Python类中的其他属性计算得到的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61825016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com