如何避免设计成员函数相互依赖的类?

时间:2019-04-01 20:19:19

标签: python oop design-patterns

假设我有一个名为Adder的类:

class adder(object):
  def __init__(self, a, b):
     self.a=a
     self.b=b
     self.result = None

  def perform_addition(self):
     self.result = self.a + self.b
     return self.result

如果我实例化此类:

myAdder = adder(1,2)

然后,myAdder.result的值取决于首先调用perform_addition(),否则它将始终保持为None。换句话说,self.result的值与perform_addition()有关。而且,如果我们进行推断,则更复杂的类可以具有一系列依赖关系:即,您必须在D之前调用函数A,B和C,因为它们又会填充下一个函数所需的必要变量。

这是不好的课堂设计吗?有什么补救办法? 我认为以上示例是:https://en.wikipedia.org/wiki/Sequential_coupling

2 个答案:

答案 0 :(得分:1)

最好将result设置为属性,以便仅在访问result属性时执行加法操作:

class adder(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def result(self):
        return self.a + self.b

myAdder = adder(1,2)
print(myAdder.result)

这将输出:3

如果预计result属性将被多次访问并且所涉及的计算成本很高,则可以将结果保存在实例变量中,以避免重新计算:

class adder(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self._result = None

    @property
    def result(self):
        if self._result is None:
            self._result = self.a + self.b
        return self._result

答案 1 :(得分:1)

我认为这一切都取决于您想要做什么以及如何进行。如果您希望对'perform_addition()'静态依赖以获取'self.result'的值,则所拥有的代码不一定很糟糕。但是,如果您需要动态依赖关系,那么下面的代码将是一种很好而简单的方法。这样,当通过实例化具有值“ a”和“ b”的类创建对象时,将自动计算“ self.result”。您还可以使用更高级的工具,例如属性,装饰器,描述符等。就像我说的那样,这完全取决于您的需求。

Class adder(object):
    def __init__(self, a, b):
        self.a=a
        self.b=b
        self.result = self.perform_addition()

    def perform_addition(self):
        self.result = self.a + self.b
        return self.result