Python の super() と多重継承
Python では、どの親メソッドを呼び出すかを決定するときに多重継承により複雑さが生じます。 super() 関数はこのシナリオで重要な役割を果たしますが、その動作はメソッド解決順序 (MRO) によって異なります。
MRO と super()
MRO は、親クラスで属性が検索される順序を定義します。あなたの例では:
class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it"
super(Third, self).__init__() は、MRO の最初のクラスの __init__() メソッドを呼び出します。この場合は、First です。
親メソッドの選択
super() を使用して呼び出す親メソッドを明示的に選択することはできません。 MRO は検索の順序を指定し、super() は常にその順序で最初のクラスを参照します。
例 (単一パスの継承)
の例では交差継承がないため、MRO は単純です: [Third、First、Second、object]。したがって、super(Third, self).__init__() は常に First.__init__() を呼び出します。
例 (相互継承)
次のコードを考えてみましょう。
class First(object): def __init__(self): print "first" class Second(First): def __init__(self): print "second" class Third(First): def __init__(self): print "third" class Fourth(Second, Third): def __init__(self): super(Fourth, self).__init__() print "that's it"
MRO は現在 [Fourth、Second、Third、First、 物体]。 super(Fourth, self).__init__() は、MRO の最初のクラスである Second.__init__() を呼び出します。
Ambiguous MRO
継承パスが交差する場合(例: First が Second から継承される)、Python は一貫した MRO を確立できず、例外:
TypeError: Cannot create a consistent method resolution order (MRO) for bases Second, First
結論
super() は、多重継承を操作するための強力なツールです。ただし、MRO を理解することは、super().__init__().
を使用するときに呼び出される親メソッドを決定するため、その動作を予測するために非常に重要です。以上がPython の「super()」関数は多重継承とメソッド解決順序 (MRO) でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。