【问题标题】:Managing parameter dependencies in Python 3 classes using constructors使用构造函数管理 Python 3 类中的参数依赖项
【发布时间】:2017-06-03 00:04:05
【问题描述】:

我正在设置一些水力计算脚本,并计划在未来大量使用它们。简而言之,我希望在更新单个参数时拥有完全更新对象的类方法。我的第一次传递方法是否可行,基于新参数重建对象的最 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 函数中调用初始化函数来解决依赖关系。我看不出这不起作用的原因,但我不确定以这种方式使用魔法方法的内部结构。我应该为此目的创建一个重建方法吗?或者我应该创建一个对象的新实例并将该新对象传递给自己?后两个选项似乎可行,但与调用执行我想要的现有函数相比效率低下。

【问题讨论】:

  • 写显式setter不是pythonic,你不应该调用__init__()方法。您应该查看 this 示例,该示例解释了如何使用 @property 装饰器,我认为这就是您要寻找的
  • 正是我正在寻找的东西,但无法通过 Google-fu 获得。谢谢!

标签: python class constructor dependencies


【解决方案1】:

在 cmets 中解决

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

您应该查看 this 示例,该示例解释了如何使用 @property 装饰器,
我认为,这就是您要寻找的东西 – gionni

正是我正在寻找但无法通过 Google-fu 获得的内容。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多