返回值的方法与直接设置属性的方法在Python中的区别
以下哪一个类展示了设置实例属性的最佳方法?它们是否可以根据情况互换使用?
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
3 个回答
1
我会根据具体情况来选择。如果不确定的话,我会选择第二种版本,因为它更明确,而且load_spam几乎没有(或者说很少有)副作用。副作用少的代码通常更容易维护,也更容易理解。正如你所知道的,没有绝对的规则,但这就是我处理这个问题的方式。
2
如果你是在设置实例的属性,第一种方法更符合Python的风格。如果你是在计算中间结果,那么使用函数调用也是可以的。
14
我更喜欢第二种方法。
原因很简单:有副作用的过程会导致时间上的耦合。简单来说,就是如果你改变了执行这些过程的顺序,可能会导致代码出错。通过返回值并将其传递给其他需要的函数,可以让不同函数之间的沟通变得清晰,这样更容易理解,也不容易搞错顺序。
而且,返回一个值也让测试你的方法变得更简单。有了返回值,你可以把这个对象当成一个黑箱,忽略它内部的细节,这通常是件好事。这样一来,你的测试代码就会更稳健。