假设我有一个名为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
答案 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