从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)
那么我做错了什么?为什么类变量不通过直接引用类和类的任何实例来维护其值.
因为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)