从其他属性计算的pythonic类实例属性

时间:2015-11-30 03:37:13

标签: python class attributes

我有一个类实例,其属性是从其他属性计算出来的。属性将在实例的整个生命周期中发生变化。初始化对象时,不一定定义所有属性。

从其他属性计算属性的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

我不确定这是否合适,但它可以正常工作......

1 个答案:

答案 0 :(得分:12)

如果我理解你的问题,你应该在他们的getter中计算bc。您还应该要求用户在初始值设定项中传递a的值,因为bc在没有a的情况下无法计算。此外,似乎没有太多理由让_a_b_c保持不变 - 除非bc是计算成本高,你想要缓存它们。

例如:

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