请教一下,Python版本为3.9.6,然后运行如下的代码,为什么会出现SlaveTwo
类的对象modelTwo
打印自身的成员变量storeDataArr
的结果是['data1', 'data2']
,不应该是['data2']
?
哪个大神知道请指导一下,万分感谢🙏
class BaseClass():
storeDataArr: list = []
class SlaveOne(BaseClass):
def __init__(self):
self.storeDataArr.append("data1")
class SlaveTwo(BaseClass):
def __init__(self):
self.storeDataArr.append("data2")
modelOne = SlaveOne()
print(modelOne.storeDataArr)
modelTwo = SlaveTwo()
print(modelTwo.storeDataArr)
# 打印结果
['data1']
['data1', 'data2']
然后尝试在两个子类中也都定义了一下成员变量storeDataArr
,代码如下,然后打印出来的结果就是我想要的样子了,但是这样定义的话,继承就没有了意义
class BaseClass():
storeDataArr: list = []
class SlaveOne(BaseClass):
def __init__(self):
self.storeDataArr.append("data1")
class SlaveTwo(BaseClass):
storeDataArr: list = []
def __init__(self):
self.storeDataArr.append("data2")
modelOne = SlaveOne()
print(modelOne.storeDataArr)
modelTwo = SlaveTwo()
print(modelTwo.storeDataArr)
# 打印结果
['data1']
['data2']
在 Python 中,类变量(如在
BaseClass
中定义的storeDataArr
)是在类层面共享的,而不是每个实例独立拥有的。当创建SlaveOne
和SlaveTwo
的实例时,它们引用的是同一个storeDataArr
列表对象。详细解释:
BaseClass
时,Python 创建了一个类变量storeDataArr
,它是一个空列表。SlaveOne
和SlaveTwo
继承了这个类变量。modelOne = SlaveOne()
时,self.storeDataArr.append("data1")
向这个共享列表添加了 "data1"。modelTwo = SlaveTwo()
时,self.storeDataArr.append("data2")
向同一个列表添加了 "data2"。所以最终两个实例共享同一个列表,包含了 ["data1", "data2"]。
在第二段代码中,在
SlaveTwo
中重新定义了storeDataArr
,这样它就有了自己独立的列表,不再共享BaseClass
的列表。正确的做法是在
__init__
方法中初始化实例变量,而不是使用类变量:这样每个实例都会有自己独立的
storeDataArr
列表,同时也保留了继承的意义。