我正在设置一些水力计算脚本,并计划将来使用它们。简而言之,我想在更新单个参数时使用类方法来完整地更新对象。我的第一个传递方法是否可行,以及基于新参数重建对象的最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函数中的初始化函数来解决依赖关系。我没有理由认为这不起作用,但我不确定以这种方式使用魔法的内部结构。我应该为此目的创建重建方法吗?或者我应该创建一个新的对象实例并将该新对象传递给自己?后两个选项似乎可行,但与调用已经存在的功能相比,效率低下。
答案 0 :(得分:1)
已在评论中解决:
写明确
setters
并不是pythonic,你不应该调用__init__() method
。您应该查看this示例,该示例解释了如何使用@property装饰器,
哪个,我瘦,是你在找什么 - gionni正是我所寻找的,无法通过Google-fu获得。谢谢!