在 python 中谈论类属性时的常见示例如下:
Python 2.7.6 (default, Sep 9 2014, 15:04:36)
>>> class B(object):
... cv = []
...
>>> b1 = B()
>>> b2 = B()
>>> b1.cv, b2.cv, B.cv
([], [], [])
>>> b1.cv.append(1)
>>> b1.cv, b2.cv, B.cv
([1], [1], [1])
>>> b2.cv.append(2)
>>> b1.cv, b2.cv, B.cv
([1, 2], [1, 2], [1, 2])
>>> B.cv.append(3)
>>> b1.cv, b2.cv, B.cv
([1, 2, 3], [1, 2, 3], [1, 2, 3])
它表明类属性在类及其所有实例之间共享。
但是当我们重新分配类属性的值时会发生这种情况,即没有绑定到类属性的初始对象的突变:
>>> class A(object):
... cv = 0
...
>>> a1 = A()
>>> a2 = A()
>>> a1.cv, a2.cv, A.cv
(0, 0, 0)
>>> a1.cv = 1
>>> a1.cv, a2.cv, A.cv
(1, 0, 0)
>>> a2.cv = 2
>>> a1.cv, a2.cv, A.cv
(1, 2, 0)
>>> A.cv = 3
>>> a1.cv, a2.cv, A.cv
(1, 2, 3)
在这里我们可以看到,每次这个类属性存储它的唯一值,并且在实例和类命名空间应用的下一个分配中它不会被覆盖。
为什么会有这样的行为?
我无法理解这种逻辑可能是什么样的逻辑,它会导致“不可变”(A)和“可变”(B)情况下如此“不相关”的行为。这让我想到“没有任何使用感类变量”,因为它们可能容易出错......
我希望在这条隧道里看不到光的人是我……