Skip to content

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 决定。
  • MROC3 计算,可用 __mro__ / mro() 查看。
  • 多重继承下 __init__父类.__init__(self, ...) 逐个调用;广泛使用 super() 时需统一协作约定。

参考