<一覧に戻る

メソッド解決順序(MRO)とmro() メソッド

Pythonのクラスにおけるメソッド解決順序(Method Resolution Order, MRO)は、特に多重継承を使用する際に重要な概念です。MROは、Pythonがメソッドを探す順序を決定するルールです。このルールを理解することで、複雑な継承構造を持つクラスにおけるメソッドの呼び出しがどのように行われるかを把握することができます。

MROの基本概念

Pythonでは、クラスがメソッドや属性を持つ場合、そのクラス自体と、そのクラスの親クラスを順に調べていきます。多重継承では、どの親クラスからメソッドを呼び出すかの順序が重要になります。

C3リニアリゼーション

PythonはC3リニアリゼーションというアルゴリズムを使用して、MROを決定します。このアルゴリズムは、クラスの継承関係を考慮しつつ、親クラスの順序を指定します。

mro() メソッド

mro() メソッドは、クラスのMROをリストとして返します。このメソッドを使用することで、特定のクラスがどのようにメソッドを解決するかを確認できます。

サンプルコード

以下に、多重継承を用いたサンプルコードを示します。このコードを通じて、MROの理解を深めましょう。

class A:
    def greet(self):
        return "Hello from A"

class B(A):
    def greet(self):
        return "Hello from B"

class C(A):
    def greet(self):
        return "Hello from C"

class D(B, C):
    pass

# DクラスのMROを確認する
print(D.mro())  # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

# Dクラスのインスタンスを作成
d_instance = D()
print(d_instance.greet())  # "Hello from B"

コード解説

  1. クラスA、B、Cの定義:
  2. Aは基本クラスで、greetメソッドを持っています。
  3. BCAを継承し、それぞれ独自のgreetメソッドを持っています。

  4. クラスDの定義:

  5. DBCを多重継承しています。

  6. MROの確認:

  7. D.mro()を呼び出すことで、Dクラスのメソッド解決順序をリストとして出力します。この結果から、PythonはDのインスタンスでgreetメソッドを呼び出す際に、まずBを検索し、次にC、その後にA、最後にobjectを検索することがわかります。

  8. メソッドの呼び出し:

  9. d_instance.greet()を呼び出すと、DのインスタンスからBgreetメソッドが実行され、「Hello from B」という結果が得られます。

まとめ

メソッド解決順序(MRO)とmro()メソッドは、特に多重継承を扱う際に非常に重要です。MROを理解することで、どのメソッドが呼び出されるかを正しく把握でき、意図しない動作を避けることができます。この知識は、より複雑なプログラムを作成する際に役立つでしょう。

出力結果: