【问题标题】: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,但它不是!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-02
          • 2023-03-10
          • 2023-03-09
          • 2015-06-21
          • 2016-07-15
          • 2022-01-20
          • 2015-12-14
          相关资源
          最近更新 更多