Python双父类继承:如何简洁规范地实现?
双父类继承的规范实现方案
你的原代码报错核心原因是super的用法不符合Python MRO(方法解析顺序)规则:FullName的MRO顺序是[FullName, AddsFunct, AddsFunct2, object],当你写super(AddsFunct, self).__init__()时,super会跳过AddsFunct,直接调用MRO链中的下一个类AddsFunct2的__init__;而super(AddsFunct2, self).__init__()会调用object的__init__,完全没触发AddsFunct的初始化,导致self.greet1不存在,最终引发报错。
下面是两种简洁规范的实现方式:
方式一:父类遵循MRO协作(推荐复杂继承场景)
让每个父类的__init__都调用super(),这样子类只需一次super()调用,就能按MRO顺序自动初始化所有父类:
class AddsFunct: def __init__(self): self.greet1 = "hello" super().__init__() # 触发MRO链下一个类的初始化 class AddsFunct2: def __init__(self): self.greet2 = "world" super().__init__() # 最终调用object的__init__,无实际操作但符合规范 class FullName(AddsFunct, AddsFunct2): def __init__(self, name, surname): super().__init__() # 按MRO依次调用AddsFunct、AddsFunct2的__init__ self.name = name self.surname = surname def printer(self): print(f"{self.greet1} {self.name} {self.surname} {self.greet2}") fullname = FullName("John", "Doe") fullname.printer() # 输出:hello John Doe world
这种方式的优势是后续调整继承顺序、新增父类时,无需修改子类的初始化逻辑,符合Python多继承的设计规范。
方式二:显式调用父类__init__(适合简单独立父类场景)
如果父类逻辑完全独立,直接显式调用每个父类的__init__方法,逻辑更直观:
class AddsFunct: def __init__(self): self.greet1 = "hello" class AddsFunct2: def __init__(self): self.greet2 = "world" class FullName(AddsFunct, AddsFunct2): def __init__(self, name, surname): AddsFunct.__init__(self) # 直接调用AddsFunct的初始化 AddsFunct2.__init__(self) # 直接调用AddsFunct2的初始化 self.name = name self.surname = surname def printer(self): print(f"{self.greet1} {self.name} {self.surname} {self.greet2}") fullname = FullName("John", "Doe") fullname.printer() # 输出:hello John Doe world
这种写法无需依赖MRO规则,适合父类之间没有协作、继承结构不会频繁变动的场景。
内容的提问来源于stack exchange,提问作者user12582392
相关产品推荐
相关产品推荐

