在Python类中,声明变量更好的位置是哪里?

4

当我写一个类时,我会在__init__方法中声明一些变量,并在其他函数中声明一些其他变量。因此,我通常最终得到像这样的东西:

class Foo:
    def __init__(self,a, b):
        self.a=a
        self.b=b
    def foo1(self,c, d)
        sum=self.a+self.b+c+d
        foo2(sum)
    def foo2(self,sum)
        print ("The sum is ", sum)

我认为这种方式有点混乱,因为很难跟踪所有变量。相反,当变量在__init__方法内被声明时,管理它们会更加容易。因此,与之前的形式不同,我们将会有:

class Foo:
    def __init__(self,a, b, c, d, sum):
        self.a=a
        self.b=b
        self.c=c
        self.d=d
        self.sum=sum
    def foo1(self)
        self.sum=self.a+self.b+self.c+self.d
        foo2(self.sum)
    def foo2(self)
        print ("The sum is ", self.sum)

你会选择哪一个并为什么?你认为在__init__方法中声明类的所有函数的所有变量是否是更好的实践?


1
你在 Foo.foo1 中的 foo2(sum) 调用将不会被执行,因为在它上面的一行有一个 return 语句。 - Martijn Pieters
@MartijnPieters +1。我删除了“returns”。 - multigoodverse
2个回答

5

你的sum 是一个很好的计算值的候选者,即像类变量(而不是方法)一样的方法。这可以通过使用@property来实现。

class Foo(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def sum(self)
        return self.a + self.b

f = Foo(1, 2)
print 'The sum is' + f.sum

http://docs.python.org/2/library/functions.html#property


see link in my answer - alexvassel
1
@alexvassel 可能你应该更明确地解释你的答案。 - multigoodverse

4

至少有三个方面需要考虑:

  • 从设计的角度来看,你的构造函数应该只定义那些在类中至少被用到两次或者传达了你试图模拟的对象的本质特征的变量。
  • 从性能的角度来看,你应该使用作用域最小的变量,这可以节省查询时间。
  • 保持变量局部化,可以降低认知负荷。

因此,在构造函数中除了声明变量之外,您不应执行任何操作。那么在构造函数中调用类的其他方法呢? - multigoodverse
1
我并不是说构造函数只能声明变量,只是要求声明的变量应该是必需的,而非偶然的(例如中间结果、辅助变量等)。 - miku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接