何时使用"返回结果"何时使用" self.result"

时间:2017-12-05 12:47:53

标签: python

当你应该从函数中返回一些内容以及何时应该将结果设置为变量(self.result)时,是否有任何好的规则或做法?

假设您的课程主要目标是进行一些计算,可能是这样的:

class Calculations:
    def __init__(var1, var2, var3):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3

    def calc1(self):
        self.result1 = self.var1 + self.var2

    def calc2(self):
        self.result2 = self.var2 + self.var3

    def final_calc(self):
        self.calc1()
        self.calc2()
        return self.result1 / self.result2

if __name__ == '__main__':
    calcObject = Calculations(10, 15, 20)
    result = calcObject.final_calc()

这被认为是非常糟糕的做法吗?我同意在这个具体的例子中没有多大意义,但随着计算变得越来越复杂,我在几个其他函数中使用了一个函数的结果和变量 - 我发现自己在两个函数之间来回传递大量变量功能

1 个答案:

答案 0 :(得分:4)

要确定方法是否应将数据存储在属性和/或return中,请使用一些启发式方法:

  1. 该方法是否应修改对象的状态?属性不仅仅是存储计算结果的东西,而是在方法之间传递它们;存储在属性中的任何值都会导致对象的状态。改变那种状态的方法是否有意义?
  2. 预计该方法会产生一个值吗?像set_foo(...)这样的方法可能不会产生任何新值,可能是get_foo()calculate()之类的方法。
  3. 您是否在方法之间存在逻辑依赖关系?对于final_calc,您必须calc1calc2可用之前先致电result1result2。这些方法调用与这些属性之间没有明显的联系。这样会更明确,更容易出错:

    def final_calc(self):
        result1 = self.calc1()
        result2 = self.calc2()
        return result1 / result2
    

    你甚至可以自由地写下return self.calc1() / self.calc2()

  4. 所有应存在的属性都应在__init__中声明,方法只应更改这些属性的值。调用方法后,您的对象不应突然发芽新属性。