10.3.4 多重継承とメソッドの検索順序

>>> class Top:
...    def hoge(self):
...       print('TopA')
...
>>> class MiddleA(Top):
...    def hoge(self):
...       print('MiddleA')
...
>>> class MiddleB(Top):
...    def hoge(self):
...       print('MiddleB')
...
>>> #MiddleA/Bクラスを多重継承
>>> class Low(MiddleA, MiddleB):
...    pass
...
>>> if __name__ == '__main__':
...    l = Low()
...    l.hoge()
...
MiddleA
>>>
  1. 1.Topという名前のクラスが作成され、その中にhogeというメソッドが定義されています。このメソッドは文字列'TopA'を出力します。


  2. 2.MiddleA
    という名前の新しいクラスが作成され、Topクラスを継承しています。つまり、MiddleATopのすべてのメソッドや属性を受け継いでいます。ここでは、hogeメソッドをオーバーライド(上書き)し、代わりに文字列'MiddleA'を出力します。


  3. 3.同様に、MiddleBという名前の新しいクラスもTopクラスを継承し、hogeメソッドをオーバーライドします。このメソッドは文字列'MiddleB'を出力します。


  4. 4.Low
    という新しいクラスが作成され、MiddleAMiddleBクラスを多重継承します。多重継承は、一つのクラスが複数のスーパークラスから継承することを指します。このクラスでは新たなメソッドや属性を追加していません。


  5. 5.最後に、Lowクラスのインスタンスlが作成され、hogeメソッドが呼び出されます。このメソッドの呼び出しは、'MiddleA'を出力します。これはPythonのメソッド解決順序(Method Resolution Order、MRO)により、多重継承の際、先に列挙されたクラス(ここではMiddleA)のメソッドが優先的に呼び出されるためです。


・メソッドの検索ルールを知る

mroメソッドを使うと、検索アルゴリズムを理解せずに、複数の継承順序、ひし形継承問題解決することができます。