返回值与在Python中直接设置属性的方法的方法

时间:2011-08-22 19:36:32

标签: python oop coding-style

以下哪个类将演示设置实例属性的最佳方法?它们应该根据情况互换使用吗?

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 个答案:

答案 0 :(得分:9)

我更喜欢第二种方法。

原因如下: 具有副作用的程序倾向于引入时间耦合。简而言之,更改执行这些过程的顺序可能会破坏您的代码。返回值并将它们传递给需要它们的其他方法会使方法间通信显式化,从而更容易推理并且难以忘记/得到错误的顺序。

同样返回一个值可以更轻松地测试您的方法。使用返回值,您可以将封闭对象视为黑盒子并忽略对象的内部,这通常是一件好事。它使您的测试代码更加健壮。

答案 1 :(得分:0)

我确实会根据情况选择。如果有疑问,我会选择第二个版本,因为它更明确,load_spam没有(或至少更少)副作用。较少的副作用通常会导致代码更容易维护和更容易理解。如你所知,没有例外的规则。但这就是我解决问题的方式。

答案 2 :(得分:0)

如果要设置实例属性,则第一种方法更像Pythonic。如果您正在计算中间结果,那么函数调用就可以了。请注意,第二种方法不仅不是Pythonic,它具有误导性 - 它被称为load_spam,但它没有!