twi*_*tom 3 python attributes class
我有一个类实例,其属性是从其他属性计算的.属性将在实例的整个生命周期中发生变化.初始化对象时,不一定定义所有属性.
什么是从其他属性计算属性的pythonic方法?
这是一个简单的例子,计算有许多输入变量(下面的"a")和计算("b"和"c").
a = something
b = function of a (a+5)
c = function of a and b (a*b)
Run Code Online (Sandbox Code Playgroud)
我尝试了很多实现.这是一个体面的沟通我的意图.
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
Run Code Online (Sandbox Code Playgroud)
注意:如果我先调用tb,则tc有效.
> >>> 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
> >>>
Run Code Online (Sandbox Code Playgroud)
请记住,大多数实际计算都依赖于多个属性(5-10个输入变量和多个计算变量).
我的下一次迭代将包括一个"calculate_model"函数,它将在检查所有输入都已定义后填充所有计算的属性.也许这将是pyhonic的答案?
谢谢!
更新 - 工作解决方案
我创建了一个按顺序计算每个属性的方法:
def calc_model(self):
self.calc_b()
self.calc_c()
Run Code Online (Sandbox Code Playgroud)
每个计算的属性都调用该方法
@property
def c(self):
self.calc_model()
return self._c
Run Code Online (Sandbox Code Playgroud)
我不确定这是否合适,但它可以按预期工作......
jme*_*jme 13
如果我正确理解你的问题,你应该计算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
Run Code Online (Sandbox Code Playgroud)
这样
>>> x = CalcAttr(42)
>>> x.c
1974
Run Code Online (Sandbox Code Playgroud)