从潜水到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
>>>
那么我做错了什么?为什么类变量不通过直接引用类和类的任何实例来维护其值。
答案 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 __中添加符号来遮盖符号。