精通 Python 多重继承、多层继承与方法解析顺序 (MRO)
Python 多重继承
探索 Python 如何支持多重继承、多层继承的细微差别,以及方法解析顺序 (MRO) 如何控制属性查找。
Python 多重继承
Python 允许类继承多个基类,正如 C++。此特性称多重继承,让派生类组合多个父类的行为。
语法同单继承:在括号中列出所有父类,逗号分隔。
示例
class Base1: pass
class Base2: pass
class MultiDerived(Base1, Base2): pass
此例中 MultiDerived 继承 Base1 和 Base2 的属性和方法。

图示:MultiDerived 从 Base1 和 Base2 接收特性。
Python 多层继承
超越两层,可链式继承:类继承自派生类,形成多层继承层级。Python 支持任意深度。
每个新派生类继承自直接父类,同时传承祖先属性。
示例:
class Base: pass
class Derived1(Base): pass
class Derived2(Derived1): pass
此处 Derived1 扩展 Base,Derived2 再扩展 Derived1,形成三层链。

Python 方法解析顺序 (MRO)
每个 Python 类最终继承自 object,即通用基类型。因此所有对象都是 object 实例,无论内置或用户定义:
# 输出: True
print(issubclass(list,object))
# 输出: True
print(isinstance(5.5,object))
# 输出: True
print(isinstance("Hello",object))
涉及多重继承时,Python 用深度优先、左到右遍历解析属性,不重复访问类。此遍历顺序称方法解析顺序 (MRO),保证类出现在其父类之前。
MultiDerived 的 MRO 为:[MultiDerived, Base1, Base2, object]。可通过 __mro__ 属性或 mro() 方法查看:
MultiDerived.__mro__
# (<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>)
MultiDerived.mro()
# [<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
复杂继承图遵循同一原则。考虑此例:

# MRO 演示
class X: pass
class Y: pass
class Z: pass
class A(X, Y): pass
class B(Y, Z): pass
class M(B, A, Z): pass
print(M.mro())
# 输出:
# [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
深入了解计算 MRO 的算法,请查阅官方 Python 文档 类继承 及 MRO 讨论。
Python