2012-09-30 154 views
3

我试过下面的例子,需要一些澄清..在这两种情况下,我能够访问测试函数中的类变量和实例。类变量vs实例变量--Python

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

code.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) 

回答

3

对于所有实例使用的“常量”,类变量都非常好(这是所有方法在技术上的原因)。你可以使用模块全局变量,但是使用类变量可以更清楚地与类相关联。

实际上也经常使用类变量,但通常情况下最好远离它们,因为您远离程序的不同部分通过更改全局变量进行通信的原因。

实例变量适用于实际上是实例的一部分的数据。它们对于每个特定实例可能不同,并且它们经常在单个特定实例的生命周期中改变。对于数据来说,最好使用实例变量作为实例的一部分,即使在您的程序中,您碰巧只有一个实例,或者您有几个实例始终具有相同的值。

3

,如果你希望它的所有实例之间共享你应该把它定义为一个类属性。如果您需要为每个实例分别设置一个实例变量(例如,如果不同实例的变量值可能不同),则应将其定义为实例变量。

3

这是很好的做法是只使用类的属性,如果他们要保持固定,以及关于它们的一个伟大的事情是,他们可以一个实例的外部访问:

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 
+0

B获得了自己的“实例”之类的变量? –

+0

@ Reb.Cabin不,他们是全球性的。 –

+0

'a.var1'与'b.var1'不同,但是,正如你的例子所示,我认为'b.var1'和'MyClass.var1'是一样的(至少我的实验与这个想法是一致的) 。所以,以某种方式将'3'分配给'a.var1'使得实例'a'成为特定的东西。你会好好解释一下吗? –

6

我知道这是一个古老的..但我发现这在由Guido van Rossum的1999年(http://legacy.python.org/doc/essays/ppt/acm-ws/sld001.htm)制作的老介绍,我想这说明了精美的话题:

实例变量规则

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

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

在通过实例分配新建分配FY(self.x = ...):

  • 总是让变量
  • 类变量 “默认” 为实例的实例变量

但......!

  • 可变类变量:一个副本所有
  • 可变实例变量共享:每个实例自己的