为什么修改类变量后没有同步更新该类的所有实例?
类变量修改未同步到所有实例的核心原因
你执行one.var = 2的时候并没有修改类变量,只是给one这个实例新增了一个和类变量同名的实例属性,二者是完全独立的,自然不会影响其他实例的访问结果。
Python的属性访问和赋值是两套逻辑:
- 当你读取实例属性(比如
print(one.var))时,会先在实例自身的属性字典__dict__里查找对应的键,找不到才会去所属类的属性字典里找,还找不到就顺着继承链往上找。最开始两个实例都没有自己的var属性,所以都会返回类变量MyClass.var的值1,这符合你对「类变量可被所有实例共享访问」的认知。 - 当你给实例属性赋值(比如
one.var = 2)时,Python默认只会修改实例自身的属性字典,不会改动类的属性。执行这行代码后,one的属性字典里就多了一个值为2的var属性,后续读取one.var会直接返回这个实例属性的值,不会再去查找类变量。而two没有同名的实例属性,所以读取two.var时还是返回类变量的原值1。
如果你确实需要修改类变量,让所有没有同名实例属性的实例都拿到新值,应该直接通过类名赋值:
MyClass.var = 2
这时候再访问two.var就会返回2,但已经有同名实例属性的one访问var还是会返回自己的实例属性值,不受类变量变更的影响。
如果需要通过实例修改类变量,可以访问实例的__class__属性操作所属类:
one.__class__.var = 3 print(two.var) # 输出3
内容的提问来源于stack exchange,提问作者azertqwert
相关产品推荐
相关产品推荐

