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

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

如果我正确理解你的问题,你应该计算bc在他们的吸气剂中.您还应该要求用户a在初始值设定项中传递值,因为如果没有b,c则无法计算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
Run Code Online (Sandbox Code Playgroud)

这样

>>> x = CalcAttr(42)
>>> x.c
1974
Run Code Online (Sandbox Code Playgroud)