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
>>>
・メソッドの検索ルールを知る
mroメソッドを使うと、検索アルゴリズムを理解せずに、複数の継承順序、ひし形継承問題解決することができます。
1.Topという名前のクラスが作成され、その中にhogeというメソッドが定義されています。このメソッドは文字列'TopA'を出力します。という名前の新しいクラスが作成され、
2.MiddleATopクラスを継承しています。つまり、MiddleAはTopのすべてのメソッドや属性を受け継いでいます。ここでは、hogeメソッドをオーバーライド(上書き)し、代わりに文字列'MiddleA'を出力します。
3.同様に、MiddleBという名前の新しいクラスもTopクラスを継承し、hogeメソッドをオーバーライドします。このメソッドは文字列'MiddleB'を出力します。という新しいクラスが作成され、
4.LowMiddleAとMiddleBクラスを多重継承します。多重継承は、一つのクラスが複数のスーパークラスから継承することを指します。このクラスでは新たなメソッドや属性を追加していません。
5.最後に、Lowクラスのインスタンスlが作成され、hogeメソッドが呼び出されます。このメソッドの呼び出しは、'MiddleA'を出力します。これはPythonのメソッド解決順序(Method Resolution Order、MRO)により、多重継承の際、先に列挙されたクラス(ここではMiddleA)のメソッドが優先的に呼び出されるためです。
・メソッドの検索ルールを知る
mroメソッドを使うと、検索アルゴリズムを理解せずに、複数の継承順序、ひし形継承問題解決することができます。
コメント