我不明白这是怎么回事。我有一个"C“类,它是"B”的子类。"B“有一个属性"b”,它是类"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“的新实例。为什么会发生这种事,我该怎么解决呢?
发布于 2020-08-09 13:06:57
这是因为您将a
和b
声明为类属性,而不是实例变量。您可以将类属性视为该类的全局变量。所有对象的类属性只能有一个值。
另一方面,实例变量对于类的每个实例都是唯一的。有关更深入的解释,请参见这篇文章。
概括地说:
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
https://stackoverflow.com/questions/63331296
复制相似问题