使用构造函数

时间:2017-06-01 16:48:12

标签: python class constructor dependencies

我正在设置一些水力计算脚本,并计划将来使用它们。简而言之,我想在更新单个参数时使用类方法来完整地更新对象。我的第一个传递方法是否可行,以及基于新参数重建对象的最pythonic方法是什么?

class Conduit(object):
    """
    Defines a Conduit through a set of knowns. All internals are kept
    in metric.
    """

    def __init__(self, b=0, n=0, S=0, y=0, Q=0, V=0):
        self.b = float(b)
        self.n = float(n)
        self.S = float(S)
        self.y = float(y)
        self.Q = float(Q)
        self.V = float(V)
        self.A = self._A()
        self.V = self._V()
        self.Q = self._Q()

    def set_width(self, b):
        self.__init__(b=b, y=self.y, n=self.n, S=self.S, Q=self.Q, V=self.V)

    def set_depth(self, y):
        self.__init__(b=self.b, y=y, n=self.n, S=self.S, Q=self.Q, V=self.V)

    def set_flow_rate(self, Q):
        self.__init__(b=self.b, y=self.y, n=self.n, S=self.S, Q=Q, V=self.V)

    def set_slope(self, S):
        self.__init__(b=self.b, y=self.y, n=self.n, S=S, Q=self.Q, V=self.V)

    def set_n(self, n):
        self.__init__(b=self.b, y=self.y, n=n, S=self.S, Q=self.Q, V=self.V)

    def _A(self):
        if self.b and self.y:
            return self.b * self.y
        elif self.Q and self.V:
            return self.Q / self.V

    def _V(self):
        if self.V:
            return self.V
        elif self.Q and self.y and self.b:
            return self.Q / (self.y * self.b)

    def _Q(self):
        if self.Q:
            return self.Q
        elif self.V and self.y and self.B:
            return self.V * self.y * self.b

    def Froude(self):
        if self.V and self.y:
            return self.V / sqrt(9.814 * self.y)
        elif self.Q and self.y and self.b:
            return (self.Q / (self.y * self.B)) / sqrt(9.814 * self.y)

我只是调用set_x函数中的初始化函数来解决依赖关系。我没有理由认为这不起作用,但我不确定以这种方式使用魔法的内部结构。我应该为此目的创建重建方法吗?或者我应该创建一个新的对象实例并将该新对象传递给自己?后两个选项似乎可行,但与调用已经存在的功能相比,效率低下。

1 个答案:

答案 0 :(得分:1)

  

已在评论中解决

     

写明确setters并不是pythonic,你不应该调用__init__() method

     

您应该查看this示例,该示例解释了如何使用@property装饰器,
  哪个,我瘦,是你在找什么 - gionni

     

正是我所寻找的,无法通过Google-fu获得。谢谢!