You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多继承如何访问所有父类的继承属性?

问题分析

你遇到的核心问题是:Python中所有父类的self指向同一个Composite实例,A、B、Status的status本质是同一个变量,后续赋值会覆盖之前的,自然无法区分A和B各自的状态。

解决方案

下面提供两种可行的解决思路:

思路1:给不同父类的状态属性加前缀

修改A和B类,让它们的状态属性使用不同名称,避免冲突:

class Status():
    def __init__(self, status: str = ""):
        self.status = status

class A(Status):
    def __init__(self):
        # 改用a_status作为A类的状态属性
        self.a_status = "Disconnected"

    def connect(self):
        if self.a_status == "Disconnected":
            print("Connecting A")
            self.a_status = "Connected"
        else:
            print("A already connected, doing nothing")

    def disconnect(self):
        if self.a_status == "Connected":
            print("Disconnecting A")
            self.a_status = "Disconnected"
        else:
            print("A already disconnected, doing nothing")

class B(Status):
    def __init__(self):
        # 改用b_status作为B类的状态属性
        self.b_status = "B Uninitialized"

class Composite(A, B, Status):
    def __init__(self):
        super().__init__()
        self.status = "Composite Uninitialized"

使用时可通过composite.a_status访问A的状态,composite.b_status访问B的状态,composite.status访问Composite自身的状态。

思路2:使用组合代替多继承(更推荐)

多继承容易引发属性冲突和MRO(方法解析顺序)问题,用组合方式把A和B作为Composite的实例属性,逻辑更清晰:

class Status():
    def __init__(self, status: str = ""):
        self.status = status

class A(Status):
    def __init__(self):
        super().__init__("Disconnected")

    def connect(self):
        if self.status == "Disconnected":
            print("Connecting A")
            self.status = "Connected"
        else:
            print("A already connected, doing nothing")

    def disconnect(self):
        if self.status == "Connected":
            print("Disconnecting A")
            self.status = "Disconnected"
        else:
            print("A already disconnected, doing nothing")

class B(Status):
    def __init__(self):
        super().__init__("B Uninitialized")

class Composite(Status):
    def __init__(self):
        super().__init__("Composite Uninitialized")
        # 把A和B作为Composite的实例属性
        self.a_instance = A()
        self.b_instance = B()

使用示例:

comp = Composite()
print(comp.status)          # 输出Composite自身状态
print(comp.a_instance.status) # 输出A的初始状态
comp.a_instance.connect()
print(comp.a_instance.status) # 输出A连接后的状态
print(comp.b_instance.status) # 输出B的状态
补充说明

如果坚持用多继承且不想修改属性名,也可以直接调用父类构造方法并手动保存状态,但这种方式可读性差,不推荐:

class Composite(A, B, Status):
    def __init__(self):
        A.__init__(self)
        self.a_status = self.status
        B.__init__(self)
        self.b_status = self.status
        super().__init__("Composite Uninitialized")

内容的提问来源于stack exchange,提问作者Frac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:11:24