ホームページ >バックエンド開発 >Python チュートリアル >Python の「super()」は多重継承におけるメソッド呼び出しをどのように解決するのでしょうか?

Python の「super()」は多重継承におけるメソッド呼び出しをどのように解決するのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 17:35:20865ブラウズ

How Does Python's `super()` Resolve Method Calls in Multiple Inheritance?

多重継承が Python の super() の動作に与える影響

Python の多重継承により、メソッドの解決が複雑になります。 Python は、メソッド解決順序 (MRO) を決定して、super() によって呼び出される親メソッドを確立します。

この例では、Third は First と Second の両方から継承します。 super().__init__() が Third.__init__() で呼び出される場合、MRO は親クラスを左から右に評価するため、First.__init__() を参照します。 First は、継承チェーンの Second の前にリストされます。

Python は、MRO を構築するときに、継承リスト内のクラスの順序を優先します。したがって、次の例では、MRO は [Fourth, Second, Third, First, object]:

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")

このシナリオでは、Fourth は Second.__init__() の代わりに First.__init__() を呼び出します。 MRO では First が最初に検出されるためです。

ただし、継承順序がreversed:

class Third(Second, First):
    def __init__(self):
        print("third")

その後、MRO は [Third, Second, First, object] になり、Third は最初に Second.__init__() を呼び出します。

特に、Python は一貫した MRO を強制します。 。継承チェーンに矛盾がある場合、予期しない動作を防ぐために例外が発生します。

以上がPython の「super()」は多重継承におけるメソッド呼び出しをどのように解決するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。