Python class 继承没有给我单独的列表实例

Python class inheritence isn't giving me separate instances of a list

我不明白这是怎么回事。我有一个 class“C”,它是“B”的子class。 “B”有一个属性“b”,它是 class“A”的一个实例。 “A”有一个属性,称为“a”的列表。当我初始化“C”的两个不同实例时,它们具有相同的“A”实例,这样当我附加到 A.a 时,它会导致“C”的两个实例都具有附加属性“b.a ".

class A:
    a = list()

class B:
    b = A()

class C(B):
    pass

one = C()
two = C()
one.b.a.append('one')
one.b.a.append('two')
two.b.a.append('three')

print(one.b.a)
print(two.b.a)

运行 此代码打印出:

['one', 'two', 'three']
['one', 'two', 'three']

很明显,one.b.a 和 two.b.a 指向同一个对象,而我本以为每次调用 C() 时都会初始化“A”的新实例。为什么会发生这种情况,我该如何解决?

这是因为您将 ab 声明为 class 属性并且 NOT 实例变量。您可以将 class 属性视为 class 的全局变量。所有对象的 class 属性只能有一个值。

另一方面,实例变量对于 class 的每个实例都是唯一的。有关更深入的解释,请参阅 this article

总结一下:

class A:
    a = 'A'
    
    def __init__(self):
        self.b = 'B'

foo = A()
bar = A()

foo.a
>>> A

bar.a
>>> A

foo.b
>>> B

bar.b
>>> B

A.a = 'C'
foo.a
>>> C
bar.a
>>> C

foo.b = 'D'
bar.b
>>> B