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

`super()` は Python の多重継承でメソッド呼び出しをどのように解決しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-27 10:33:14192ブラウズ

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

Python の多重継承

Python の多重継承では、super() がどのように対話するかという問題が生じます。次のコードを考えてみましょう:

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

さて、super().__init__ は Third のどの親メソッドを参照しているでしょうか?どちらを実行するか選択できますか?

このコンテキストで super() を理解するために、メソッド解決順序 (MRO) の概念を詳しく調べます。 Python では、MRO は、多重継承が関係する場合にメソッドが解決される順序を定義します。

この例では、Third() は First.__init__ を呼び出します。 Python は、クラスの親の各属性を左から右に調べます。 __init__ の場合、Python はまず First を調べ、見つからない場合は Second をチェックします。

継承が絡み合うと、状況はさらに複雑になります。詳細については、MRO に関する Guido のブログ投稿を参照してください。ただし、Python は通常、子クラス自体から始まる継承順序を記述どおりに維持します。

次の例を考えてみましょう:

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] になります。 、3 番目、1 番目].

Python が一貫した MRO を決定できない場合、再計算ではなく例外が発生することに注意することが重要です。

さらに、提供されている例では super() 呼び出しが使用されていないことにも言及する価値があります。これらの目的は、MRO がどのように構築されるかを示すことであり、特定の出力を出力することではありません。 Python の継承モデルをより深く理解するために、super() 呼び出しを試してみることをお勧めします。

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

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