Python 多重继承
多重继承指一个类在定义时括号里列出多个父类:class C(A, B): ...。子类会按语言规则合并各父类提供的属性与方法;同名方法究竟用哪一个,由 方法解析顺序(MRO, Method Resolution Order) 决定。
Python 支持多重继承(与 Java 单继承模型不同)。实际项目中要谨慎设计,避免过深的菱形继承与难以预测的 super() 链。单继承基础见 类的继承。
语法
python
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass括号内从左到右的次序会参与 MRO 计算,进而影响同名成员的查找顺序。
示例:两个父类与各自的 __init__
子类常显式调用每个直接父类的 __init__,把 self 传进去:
python
class Manager:
def __init__(self, name, idnumber):
self.name = name
self.idnumber = idnumber
class Employee:
def __init__(self, salary, post):
self.salary = salary
self.post = post
class Person(Manager, Employee):
def __init__(self, name, idnumber, salary, post, points):
self.points = points
Manager.__init__(self, name, idnumber)
Employee.__init__(self, salary, post)
print(self.salary)
ins = Person("Rahul", 882016, 75000, "Assistant Manager", 560)输出:
text
75000若改用 super(),在多重继承里应配合协作式设计(各层 __init__ 都使用 super() 且参数签名兼容),否则容易只初始化到 MRO 中的一条链;入门阶段用 父类.__init__(self, ...) 逐个调用往往更直观。
方法解析顺序(MRO)
在实例上访问 obj.method() 或属性时,解释器按 MRO 从前往后查找:先当前类,再按 MRO 列表依次看父类。
Python 3 对新式类采用 C3 线性化 算法生成 MRO,保证:
- 子类出现在其父类之前;
- 父类在类定义括号中的从左到右顺序会被尊重(在符合单调性的前提下);
- 结果是一条确定的线性序列,而不是简单的「深度优先、从左到右」一句话能概括的老式规则。
同名方法:以 Sprint(Dev, QA) 为例
python
class Agile:
def create(self):
print("Agile.create")
class Dev(Agile):
def create(self):
print("Dev.create")
class QA(Agile):
def create(self):
print("QA.create")
class Sprint(Dev, QA):
pass
sprint = Sprint()
sprint.create()Sprint 的 MRO 大致为 Sprint → Dev → QA → Agile → object,因此这里会调用 Dev.create。
输出:
text
Dev.create查看 MRO:__mro__ 与 mro()
python
class Material:
def create(self):
print("Material.create")
class Pencil:
def create(self):
print("Pencil.create")
class Pen(Material, Pencil):
def __init__(self):
print("Constructing Pen")
pen = Pen()
print(Pen.__mro__)
print(Pen.mro())输出(示意):
text
Constructing Pen
(<class '__main__.Pen'>, <class '__main__.Material'>, <class '__main__.Pencil'>, <class 'object'>)
[<class '__main__.Pen'>, <class '__main__.Material'>, <class '__main__.Pencil'>, <class 'object'>]Class.__mro__:元组形式的 MRO。Class.mro():返回列表(可被合理子类重写以影响 MRO,进阶话题)。
也可用 help(Pen) 或 Pen.mro() 在交互环境里查看。
小结
class C(A, B)同时继承多个父类;同名方法由 MRO 决定。- MRO 由 C3 计算,可用
__mro__/mro()查看。 - 多重继承下
__init__可父类.__init__(self, ...)逐个调用;广泛使用super()时需统一协作约定。