Python类变量或类变量一般

时间:2010-08-02 15:21:10

标签: python oop

从潜水到Python:

  

通过直接引用可以获得类属性   class和通过类的任何实例。

     

类属性可以用作类级常量,但它们是   不是真正的常量。你也可以改变它们。

所以我把它输入IDLE:

IDLE 2.6.5      
>>> class c:
        counter=0


>>> c
<class __main__.c at 0xb64cb1dc>
>>> v=c()
>>> v.__class__
<class __main__.c at 0xb64cb1dc>
>>> v.counter += 1
>>> v.counter
1
>>> c.counter
0
>>> 

那么我做错了什么?为什么类变量不通过直接引用类和类的任何实例来维护其值。

4 个答案:

答案 0 :(得分:8)

因为int在python中是不可变的

v.counter += 1

v.counter重新绑定到新的int对象。重新绑定会创建一个掩盖类属性

的实例属性

如果您查看id()

v.counter,就会发现这种情况
>>> id(v.counter)
149265780
>>> v.counter+=1
>>> id(v.counter)
149265768

您可以在此处看到v现在在其__dict__

中有一个新属性
>>> v=c()
>>> v.__dict__
{}
>>> v.counter+=1
>>> v.__dict__
{'counter': 1}

对比counter可变的情况,例如list

>>> class c:
...  counter=[]
... 
>>> v=c()
>>> v.counter+=[1]
>>> c.counter
[1]
>>> 

答案 1 :(得分:0)

您在声明实例化之间感到困惑。

C是您声明的类的名称。

v是一个对象,从c。

实例化

答案 2 :(得分:0)

在:

c.counter = 0
v.counter -> c.counter

在:

c.counter = 0
v.counter = c.counter + 1

后:

c.counter = 0
v.counter = 1

答案 3 :(得分:0)

请注意,您仍然可以获得类值:

v.__class__.__dict__['counter'] 

允许您阅读或设置到您的班级,即使您通过在实例的__dict __中添加符号来遮盖符号。