我有一个类实例,其属性是从其他属性计算出来的。属性将在实例的整个生命周期中发生变化。初始化对象时,不一定定义所有属性。
从其他属性计算属性的pythonic方法是什么?
这是一个简单的例子,计算中有许多输入变量(" a"下面)和计算(" b"&" c")。
a = something
b = function of a (a+5)
c = function of a and b (a*b)
我尝试了很多实现。这是一个很好的沟通我的意图。
class CalcAttr(object):
def __init__(self):
self._a = None
self._b = None
self._c = None
@property
def a(self):
return self._a
@a.setter
def a(self,value):
self._a = value
@property
def b(self):
self.calc_b()
return self._b
@property
def c(self):
self.calc_c()
return self._c
def calc_b(self):
self._b = self._a + 5
def calc_c(self):
self._c = self._a * self._b
def test():
abc = CalcAttr()
a = 5
return abc.c
注意:如果我先调用t.b,则t.c有效。
> >>> t=abc.test()
> >>> t.c Traceback (most recent call last): File "<stdin>", line 1, in <module> File "abc.py", line 22, in c
> self.calc_c() File "abc.py", line 29, in calc_c
> self._c = int(self._a) * int(self._b) TypeError: int() argument must be a string or a number, not 'NoneType'
> >>> t.b 10
> >>> t.c 50
> >>>
请记住,大多数实际计算都依赖于多个属性(5-10个输入变量和多个计算变量)。
我的下一次迭代将包括&#34; calculate_model&#34;在检查所有输入都已定义后,将填充所有计算属性的函数。也许这将是pyhonic的答案?
谢谢!
更新 - 工作解决方案
我创建了一个按顺序计算每个属性的方法:
def calc_model(self):
self.calc_b()
self.calc_c()
每个计算出的属性都会调用该方法
@property
def c(self):
self.calc_model()
return self._c
我不确定这是否合适,但它可以正常工作......
答案 0 :(得分:12)
如果我理解你的问题,你应该在他们的getter中计算b
和c
。您还应该要求用户在初始值设定项中传递a
的值,因为b
和c
在没有a
的情况下无法计算。此外,似乎没有太多理由让_a
,_b
和_c
保持不变 - 除非b
和c
是计算成本高,你想要缓存它们。
例如:
class CalcAttr(object):
def __init__(self, a):
self.a = a
@property
def b(self):
return self.a + 5
@property
def c(self):
return self.a * self.b
这样
>>> x = CalcAttr(42)
>>> x.c
1974