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
相关产品推荐
相关产品推荐

