以下哪个类将演示设置实例属性的最佳方法?是否应该根据情况互换使用?
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
我更喜欢第二种方法。
原因如下: 具有副作用的过程往往会引入时间耦合。简而言之,更改执行这些过程的顺序可能会破坏您的代码。返回值并将它们传递给需要它们的其他方法使得方法间通信变得明确,因此更容易推理并且很难忘记/弄错顺序。
返回一个值还可以更轻松地测试您的方法。通过返回值,您可以将封闭对象视为黑匣子并忽略对象的内部结构,这通常是一件好事。它使您的测试代码更加健壮。
如果您要设置实例属性,第一种方法更Pythonic。如果您正在计算中间结果,那么函数调用就可以了。
我确实会根据情况来选择。如果有疑问,我会选择第二个版本,因为它更明确,并且 load_spam 没有(或至少更少)副作用。较少的副作用通常会使代码更容易维护和理解。如您所知,没有无例外的规则。但这就是我解决问题的方式。