Python类变量或类变量一般

use*_*094 1 python oop

从Dive到Python:

通过直接引用类和类的任何实例,都可以使用类属性.

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

所以我把它输入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
>>> 
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ooy 8

因为int在python中是不可变的

v.counter += 1
Run Code Online (Sandbox Code Playgroud)

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

你可以看到这种情况出现,如果你看id()v.counter

>>> id(v.counter)
149265780
>>> v.counter+=1
>>> id(v.counter)
149265768
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到它v现在有一个新的属性__dict__

>>> v=c()
>>> v.__dict__
{}
>>> v.counter+=1
>>> v.__dict__
{'counter': 1}
Run Code Online (Sandbox Code Playgroud)

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

>>> class c:
...  counter=[]
... 
>>> v=c()
>>> v.counter+=[1]
>>> c.counter
[1]
>>> 
Run Code Online (Sandbox Code Playgroud)