ホームページ > バックエンド開発 > Python チュートリアル > Python の「super()」関数は多重継承とメソッド解決順序 (MRO) でどのように機能しますか?

Python の「super()」関数は多重継承とメソッド解決順序 (MRO) でどのように機能しますか?

Barbara Streisand
リリース: 2024-12-30 08:26:08
オリジナル
419 人が閲覧しました

How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート