父类有一个支持实例



假设我有以下代码:

class ParentClass():
myList = []
def __init__(self):
print("Parent class constructor")
class ChildA(ParentClass):
def __init__(self):
print("Child A constructor")
def add_elem(self, item):
self.myList.append(item)
print(f"Added item by Child A, current length: {len(self.myList)}")
class ChildB(ParentClass):
def __init__(self):
print("Child B constructor")
def add_elem(self, item):
self.myList.append(item)
print(f"Added item by Child B, current length: {len(self.myList)}")
a = ChildA()
a.add_elem(1)
a.add_elem(1)
b = ChildB()
b.add_elem(1)

当我运行它(Python 3.9.3(时,我会得到以下输出:

Child A constructor
Added item by Child A, current length: 1
Added item by Child A, current length: 2
Child B constructor
Added item by Child B, current length: 3

这表明子类继承的父类有一个后备实例,并且由于我没有在构造函数中显式地将myList设置为[],所以它使用相同的后备内存,即使是两个不同的子类。

  1. 这个假设正确吗
  2. 此设计的有效用途是什么?当我第一次发现这种行为时,我认为这可能是一个语言错误,但我觉得这不太可能

我只是通过在父构造函数中将myList显式设置为[]来解决这个问题,但我对这种行为感到困惑,因为这不是我所期望的行为(我希望第一次调用ChildBmyList的长度为1(。

我只是通过在父构造函数中将myList显式设置为[]来解决这个问题,但我对这种行为感到困惑,因为这不是我所期望的行为。

没错。您所做的是在类本身上定义一个变量,而不是在类的实例上。定义实例变量的正确方法是在构造函数中。

class ParentClass():
def __init__(self):
print("Parent class constructor")
self.myList = []

相关内容

最新更新