ホームページ >バックエンド開発 >Python チュートリアル >Python の「super()」関数は多重継承におけるメソッド解決順序 (MRO) をどのように処理しますか?
はじめに
多重継承は、どの親を決定するかを決定する際に特有の課題を提示しますsuper() 関数を使用して呼び出すメソッド。この記事では、メソッド解決順序 (MRO) との相互作用に焦点を当てて、そのようなシナリオにおける super() の動作について説明します。
Super() および親メソッド呼び出し
多重継承で super() を使用すると、MRO の最初にある親クラスのメソッドが参照されます。たとえば、以下のコード スニペットでは:
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
Third の MRO は [Third, First, Second, object] です。したがって、Third の super().__init__() は First.__init__ を参照します。
メソッド解決順序 (MRO)
MRO は、Python の検索順序を決定します。親クラスから継承されたメソッドと属性の場合。一般に、MRO は最初に子クラスをリストし、次にその親クラスがクラス定義にリストされているようにリストします。
上記の例では、MRO は [Third, First, Second, object] です。この順序は、メソッド呼び出しと属性検索を解決するために使用され、3 番目から開始して親クラスのツリーを下に移動します。
カスタマイズと曖昧さ
一方、Python は通常、 MRO は自動的に行われます。mro 属性を使用してカスタマイズできます。ただし、MRO が明確であることを確認することが重要です。そうでない場合、Python は例外を発生させます。
次のあいまいな MRO を考えてみましょう:
class First(object): def __init__(self): print("first") class Second(First): def __init__(self): print("second") class Third(First, Second): def __init__(self): print("third")
Third の MRO は [First, Second] にするべきですか、それとも [Second, First] にするべきですか?明確な期待がないため、Python は次のエラーを生成します。
TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases Second, First
MRO について
super() が多重継承とどのように相互作用するかを完全に理解するには、それが重要です。 MROの概念を理解する。 MRO の構築と解決を管理するルールを理解することで、開発者は super() を効果的に使用し、複数の継承シナリオでの潜在的な競合を回避できます。
以上がPython の「super()」関数は多重継承におけるメソッド解決順序 (MRO) をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。