7

我在下面的示例中尝试了此示例,需要进行一些说明。在这两种情况下,我都可以在测试函数中访问类变量和实例。

所以,假设我必须定义一个需要在所有函数中使用的文字,这将是定义..self 变量或类变量的更好方法?

代码.py

class testclass:
    classvar = 'its classvariable LITERAL'
    def __init__(self,x,y):
        self.z = x
        self.classvar = 'its initvariable LITERAL'

        self.test()

    def test(self):
        print('class var',testclass.classvar)
        print('instance var',self.classvar)

if __name__ == '__main__':
    x = testclass(2,3)
4

4 回答 4

9

我知道这是一个旧的.. 但我在 1999 年 Guido van Rossum 的旧演示文稿中发现了这一点 ( http://legacy.python.org/doc/essays/ppt/acm-ws/sld001.htm ) 和我认为它很好地解释了这个话题:

实例变量规则

通过实例(self.x)使用​​时,搜索顺序:

  • (1) 实例,(2) 类,(3) 基类
  • 这也适用于方法查找

通过实例分配(self.x = ...):

  • 总是创建一个实例变量
  • 实例变量的类变量“默认”

但...!

  • 可变类变量:所有人共享的一份副本
  • 可变实例变量:每个实例都有自己的
于 2013-04-13T20:40:05.570 回答
6

类变量非常适合所有实例使用的“常量”(从技术上讲,所有方法都是如此)。您可以使用模块全局变量,但使用类变量可以更清楚地与类关联。

类变量的用途也经常被您实际更改,但通常最好远离它们,原因与您远离通过更改全局变量来让程序的不同部分进行通信的原因相同。

实例变量用于实际上是实例一部分的数据。对于每个特定实例,它们可能不同,并且它们经常在单个特定实例的生命周期内发生变化。最好将实例变量用于在概念上属于实例一部分的数据,即使在您的程序中您碰巧只有一个实例,或者您有几个实例在实践中总是具有相同的值。

于 2012-09-30T01:56:29.547 回答
5

一个好的做法是只在类属性保持固定时才使用它们,关于它们的一个好处是可以在实例之外访问它们:

class MyClass():
    var1 = 1
    def __init__(self):
        self.var2 = 2

MyClass.var1 # 1 (you can reference var1 without instantiating)
MyClass.var2 # AttributeError: class MyClass has no attribute 'var2'

如果MyClass.var已定义,则在 的每个实例中都应该相同MyClass,否则您会得到以下被认为令人困惑的行为。

a = MyClass()
b = MyClass()

a.var1, a.var2 # (1,2)
a.var1, a.var2 = (3,4) # you can change these variables
a.var1, a.var2 # (3,4)
b.var1, b.var2 # (1,2) # but they don't change in b
MyClass.var1 # 1         nor in MyClass
于 2012-09-30T02:01:20.520 回答
4

如果您希望它在所有实例之间共享,则应将其定义为类属性。如果您希望每个实例都有一个单独的变量(例如,如果不同的实例可能有不同的变量值),您应该将其定义为实例变量。

于 2012-09-30T01:13:36.647 回答