多重继承让一个类同时继承多个父类,如同继承两大家族的超能力。它强大而复杂,是Python面向对象编程中的一柄双刃剑。
核心概念与力量
class Swimmer:
def swim(self):
print("划水前进")
class Flyer:
def fly(self):
print("展翅高飞")
# 多重继承:兼具游泳和飞行能力
class SuperDuck(Swimmer, Flyer):
pass
duck = SuperDuck()
duck.swim() # 输出: 划水前进
duck.fly() # 输出: 展翅高飞
- 接口聚合:快速组合多个类的能力(如
SuperDuck) - 代码复用:直接复用多个父类的实现逻辑
- 灵活建模:准确表达"is-a"多重关系(如两栖动物)
致命陷阱:菱形继承迷局
class A:
def execute(self):
print("A的逻辑")
class B(A):
def execute(self):
print("B的逻辑")
super().execute()
class C(A):
def execute(self):
print("C的逻辑")
super().execute()
class D(B, C): # 菱形结构
pass
d = D()
d.execute()
冲突爆发:
- 输出顺序:
B的逻辑 → C的逻辑 → A的逻辑 - 若父类方法未正确使用
super(),A的逻辑可能重复执行或丢失
破局关键:MRO与C3算法
Python通过方法解析顺序(MRO) 决定调用路径:
print(D.mro())
# 输出:[D, B, C, A, object]
- C3算法:基于拓扑排序,保证:
-
- 子类优先于父类
- 继承顺序从左至右(
class D(B,C)中B优先于C) - 所有父类MRO保持一致
生存法则:最佳实践
- Mixins为王:
class JSONMixin: # 无状态混入类
def to_json(self):
import json
return json.dumps(self.__dict__)
- super()统一调度:确保协作式多重继承
- 接口优先:通过抽象基类(ABC)定义契约
- 组合替代:复杂场景优先使用组合模式
掌握多重继承的精髓,方能在代码的基因重组中避免家族诅咒,真正唤醒Python对象的超级英雄潜能。

被折叠的 条评论
为什么被折叠?



