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多段継承
2レベルを超えて継承を連鎖させることも可能:クラスが派生クラスから継承し、多段継承階層を形成。Pythonは任意の深度をサポートします。
各新派生クラスは直近の親から継承し、祖先の属性も引き継ぎます。
例:
class Base: pass
class Derived1(Base): pass
class Derived2(Derived1): pass
ここではDerived1がBaseを拡張し、Derived2がさらにDerived1を拡張し、3レベルの連鎖を形成します。

Pythonにおけるメソッド解決順序(MRO)
すべてのPythonクラスは究極的にobject、普遍的基底型から継承します。したがってすべてのオブジェクトは組み込み・ユーザー定義問わずobjectのインスタンスです:
# 出力: True
print(issubclass(list, object))
# 出力: True
print(isinstance(5.5, object))
# 出力: True
print(isinstance("Hello", object))
多重継承が関与すると、Pythonは深さ優先・左から右への走査で属性を解決し、同じクラスを2度訪れません。この走査順序をメソッド解決順序(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
- C# 継承をマスターする:概念、種類、実践コード
- C#の継承:再利用可能で保守しやすいコードを構築する
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Pythonカスタム例外マスター:実践ガイド
- Pythonオブジェクト指向プログラミング完全ガイド:クラス、継承、カプセル化、ポリモーフィズム
- Python継承マスター:概念、構文、実践例
- Python type()とisinstance()の理解:実例付き解説
- Pythonオブジェクト指向プログラミング完全ガイド:クラスと継承をマスター