明确的方法论证是个好主意吗? - 惯用语

时间:2014-11-13 02:43:04

标签: python unit-testing

我正在编写一些使用有限元模型元素类的数字代码。 我很欣赏将一组参数传递给函数并传递出一个结果的函数编码风格,但我想知道在类和方法中使用这种风格是否有点多。我是否展示了我的数字根源?

我想知道:

  1. 将参数传递给方法的惯用方法是什么?
  2. 如果我想明确数据流,那么在离开pythonic品味之前我能走多远?
  3. 举例来说,我有三个课程:

    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)
    

1 个答案:

答案 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)

将实例变量传递给方法只是奇怪而且没必要。

如果xy发生变化,那么您的所有示例都会产生问题,那么除非开发人员记得更新它,否则distance将不正确。您希望即时计算distance