Pythonでは、一つのクラスが複数のスーパークラスから継承することが可能です。これを多重継承と呼びます。
多重継承の基本
Pythonの多重継承は、クラス定義で基底クラスを複数記述することで実現します。以下に基本的な例を示します。
class A:
def hello(self):
print('Hello from A')
class B(A):
pass
class C(A):
def hello(self):
print('Hello from C')
class D(B, C):
pass
この例では、Aクラスを大本のクラスとして定義し、その直接の派生クラスとしてBクラスとCクラスを定義しています。そして、それら2つのクラスを基にDクラスを定義しています。
メソッドの解決順序
多重継承を行った場合、同名のメソッドが複数のスーパークラスに存在すると、どのメソッドが呼び出されるかが問題になります。Pythonでは、この問題を解決するために「メソッド解決順序」(Method Resolution Order、MRO)という仕組みを採用しています。
MROは、サブクラスからスーパークラスへと向かってメソッドを探していき、最初に見つかったメソッドが呼び出されます。Pythonでは、MROは「C3線形化」と呼ばれるアルゴリズムを用いて決定されます。
まとめ
Pythonの多重継承は、一つのクラスが複数のスーパークラスから継承することを可能にします。しかし、同名のメソッドが複数のスーパークラスに存在する場合、どのメソッドが呼び出されるかを決定するための「メソッド解決順序」(MRO)という仕組みが必要となります。Pythonでは、このMROは「C3線形化」というアルゴリズムを用いて決定されます。