>>> class a:
... b=5
... def __init__(self,x,y):
... self.x=x
... self.y=y
...
>>> p=a(5,6)
>>> q=a(5,6)
>>> a.b
5
>>> a.b+=1
>>> p.b
6
>>> q.b
6
>>> q.b-=1
>>> q.b
5
>>> p.b
6
>>> a.b
6
如您所见,在通过实例的方法更改类变量时,同样不会反映在类变量和其他实例的类变量中。为什么会这样?
答案 0 :(得分:6)
由于q.b -= 1
创建了名为b
的实例变量,请查看__dict__
:
q.__dict__
{'b': 4, 'x': 5, 'y': 6}
p.__dict__
{'x': 5, 'y': 6}
q.b
与a.b
不同,您在分配后隐藏a.b
。请注意,这不是Python 3特有的问题,Python 2也以相同的方式运行。
语言参考的assignment statement section中明确说明了这一点:
注意:如果对象是类实例并且赋值运算符的两侧都出现属性引用,则RHS表达式
a.x
可以访问实例属性或(如果不存在实例属性)类属性。 LHS目标a.x
始终设置为实例属性,必要时创建它。因此,a.x
的两次出现不一定引用相同的属性:如果RHS表达式引用类属性,则LHS创建新的实例属性作为赋值的目标:class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3
此描述不一定适用于描述符属性,例如使用
property()
创建的属性。