Python 成员变量在多个子类实例间共享,如何避免?

请教一下,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']
阅读 208
1 个回答

在 Python 中,类变量(如在 BaseClass 中定义的 storeDataArr)是在类层面共享的,而不是每个实例独立拥有的。当创建 SlaveOneSlaveTwo 的实例时,它们引用的是同一个 storeDataArr 列表对象。

详细解释:

  1. 当定义 BaseClass 时,Python 创建了一个类变量 storeDataArr,它是一个空列表。
  2. SlaveOneSlaveTwo 继承了这个类变量。
  3. 当创建 modelOne = SlaveOne() 时,self.storeDataArr.append("data1") 向这个共享列表添加了 "data1"。
  4. 当创建 modelTwo = SlaveTwo() 时,self.storeDataArr.append("data2") 向同一个列表添加了 "data2"。

所以最终两个实例共享同一个列表,包含了 ["data1", "data2"]。

在第二段代码中,在 SlaveTwo 中重新定义了 storeDataArr,这样它就有了自己独立的列表,不再共享 BaseClass 的列表。

正确的做法是在 __init__ 方法中初始化实例变量,而不是使用类变量:

class BaseClass:
    def __init__(self):
        self.storeDataArr = []  # 实例变量,每个实例独立

class SlaveOne(BaseClass):
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法
        self.storeDataArr.append("data1")

class SlaveTwo(BaseClass):
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法
        self.storeDataArr.append("data2")

这样每个实例都会有自己独立的 storeDataArr 列表,同时也保留了继承的意义。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题