【发布时间】: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