我正在编写一些使用有限元模型元素类的数字代码。 我很欣赏将一组参数传递给函数并传递出一个结果的函数编码风格,但我想知道在类和方法中使用这种风格是否有点多。我是否展示了我的数字根源?
我想知道:
举例来说,我有三个课程:
StandardPoint 代表我认为常见的Python代码,但它隐含地传递状态,使代码不那么清晰,更难以测试。然而,它确实看起来很整洁。
ExplicitPoint 使状态变异更加明确,可能是我的首选选项。这不太整洁,仍然隐式地将状态传递给方法。我认为单元测试仍然需要模拟对象。
ExtremePoint 使所有数据传递都显式,但当然更高级别的代码更嘈杂(一行中有四个自我)。对方法进行单元测试变得非常容易。静态方法几乎可以肯定是一个步骤太过分了,但是因为你不需要自我状态才有意义。顶层函数更加pythonic(我建议),但只有当不止一个类需要它时。
from math import sqrt
class StandardPoint(object):
"""Is this idiomatic python?"""
def __init__(self, x, y):
self.x = x
self.y = y
self._calc_distance()
def _calc_distance(self):
self.distance = sqrt(self.x**2 + self.y**2)
class ExplicitPoint(object):
"""Explicit setting of attributes but implicit passing-in of data."""
def __init__(self, x, y):
self.x = x
self.y = y
self.distance = None
# ...
self.distance = self._calc_distance()
def _calc_distance(self):
return sqrt(self.x**2 + self.y**2)
class ExtremePoint(object):
"""Explicit data passing everywhere."""
def __init__(self, x, y):
self.x = x
self.y = y
self.distance = None
self.distance = self._calc_distance(self.x, self.y)
# or even
# self.distance = self._calc_distance_static(self.x, self.y)
def _calc_distance(self, x, y):
return sqrt(x**2 + y**2)
@staticmethod
def _calc_distance_static(x, y):
return sqrt(x**2 + y**2)
def calc_distance(x, y):
"""Top-level function for use by many classes."""
return sqrt(x**2 + y**2)
答案 0 :(得分:4)
最自然的方法是:
class TestClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
@property
def distance(self):
return sqrt(self.x**2 + self.y**2)
将实例变量传递给方法只是奇怪而且没必要。
如果x
和y
发生变化,那么您的所有示例都会产生问题,那么除非开发人员记得更新它,否则distance
将不正确。您希望即时计算distance
。