【问题标题】:Methods which return values vs methods which directly set attributes in Python返回值的方法与直接在 Python 中设置属性的方法
【发布时间】:2011-08-22 19:36:31
【问题描述】:
以下哪个类可以演示设置实例属性的最佳方式?是否应该根据情况互换使用?
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
【问题讨论】:
标签:
python
oop
coding-style
【解决方案1】:
我更喜欢第二种方法。
原因如下:
具有副作用的程序往往会引入时间耦合。简而言之,更改执行这些过程的顺序可能会破坏您的代码。返回值并将它们传递给需要它们的其他方法使方法间通信变得明确,因此更容易推理并且难以忘记/以错误的顺序获取。
还返回一个值可以更容易地测试您的方法。使用返回值,您可以将封闭对象视为黑盒并忽略对象的内部,这通常是一件好事。它使您的测试代码更加健壮。
【解决方案2】:
我确实会根据情况选择。如果有疑问,我会选择第二个版本,因为它更明确,并且 load_spam 没有(或至少更少)副作用。较少的副作用通常会导致代码更容易维护和更容易理解。如您所知,没有规则没有例外。但这就是我处理问题的方式。
【解决方案3】:
如果您要设置实例属性,则第一种方法更 Pythonic。如果您正在计算中间结果,那么函数调用就可以了。请注意,第二种方法不仅不是 Pythonic,而且具有误导性——它被称为 load_spam,但它不是!