以下哪个类将演示设置实例属性的最佳方法?它们应该根据情况互换使用吗?
class Eggs(object):
def __init__(self):
self.load_spam()
def load_spam(self):
# Lots of code here
self.spam = 5
或
class Eggs(object):
def __init__(self):
self.spam = self.load_spam()
def load_spam(self):
# Lots of code here
return 5
答案 0 :(得分:9)
我更喜欢第二种方法。
原因如下: 具有副作用的程序倾向于引入时间耦合。简而言之,更改执行这些过程的顺序可能会破坏您的代码。返回值并将它们传递给需要它们的其他方法会使方法间通信显式化,从而更容易推理并且难以忘记/得到错误的顺序。
同样返回一个值可以更轻松地测试您的方法。使用返回值,您可以将封闭对象视为黑盒子并忽略对象的内部,这通常是一件好事。它使您的测试代码更加健壮。
答案 1 :(得分:0)
我确实会根据情况选择。如果有疑问,我会选择第二个版本,因为它更明确,load_spam没有(或至少更少)副作用。较少的副作用通常会导致代码更容易维护和更容易理解。如你所知,没有例外的规则。但这就是我解决问题的方式。
答案 2 :(得分:0)
如果要设置实例属性,则第一种方法更像Pythonic。如果您正在计算中间结果,那么函数调用就可以了。请注意,第二种方法不仅不是Pythonic,它具有误导性 - 它被称为load_spam
,但它没有!