题主通过c2.CLASS_VALUE = 2赋值的时候实际上是动态的给实例对象c2增加了CLASS_VALUE这个实例属性
所以打印c2.CLASS_VALUE的时候会访问到刚刚动态创建的实例属性。通过打印__dict__就可以看到
而类属性没有改变,通过c1.__class__.CLASS_VALUE还是c2.__class__.CLASS_VALUE都是一样的。想改变类属性的值可以通过类来改变C.CLASS_VALUE = value
In [2]: class C(object):
...: CLASS_VALUE = 1
...:
In [3]:
In [3]: c1 = C()
In [4]: c2 = C()
In [5]: c1.CLASS_VALUE
Out[5]: 1
In [6]: c1.__dict__
Out[6]: {}
In [7]: C.__dict__
Out[7]:
dict_proxy({'CLASS_VALUE': 1,
'__dict__': ,
'__doc__': None,
'__module__': '__main__',
'__weakref__': })
In [8]: c1.CLASS_VALUE = 2
In [9]: c1.__dict__
Out[9]: {'CLASS_VALUE': 2}
In [10]: c1.__class__.CLASS_VALUE
Out[10]: 1
In [11]: c2.CLASS_VALUE
Out[11]: 1
In [12]: C.CLASS_VALUE = 10
In [13]: c1.__class__.CLASS_VALUE
Out[13]: 10
In [14]: c2.CLASS_VALUE
Out[14]: 10
In [15]: c2.__class__.CLASS_VALUE
Out[15]: 10