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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-29 19:28:12210ブラウズ

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

多重継承を使用した Python の super()

Python では、多重継承には、複数の親クラスから継承するクラスが含まれます。このようなシナリオで super() 関数を使用する場合、その動作を理解することが重要になります。多重継承における

super()

super() は主に 2 つの目的を果たします。 :

  1. 直接の親クラスの属性とメソッドにアクセスします。
  2. 子クラスに複数の親クラスがある場合、メソッドの競合を解決します。

指定されたコード スニペット内:

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

3 番目のオブジェクトがインスタンス化されると、次のことが起こります:

  • super(Third, self).__init__() は First.__init__(self) を呼び出します。これは、First が最初のクラスであるためです。 3 番目のクラスの MRO (メソッド解決順序)。
  • First.__init__(self) は「first.」を出力します。
  • Third.__init__(self) は「that's it.」を出力します。

曖昧MRO

ただし、継承チェーンがより複雑になると、MRO の決定に曖昧さが生じる可能性があります。これは、子クラスが同じ基本クラスを継承する複数のクラスを継承する場合に発生します。このような場合、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")

Second と Third の両方を継承するクラスを作成しようとすると、Python は TypeError を発生させます。曖昧なMROに。継承リスト内の親クラスの順序は重要であり、コードベース全体で一貫している必要があります。

結論

Python の super() 関数は、管理のための強力なツールです。多重継承。その動作を理解することで、メソッドの競合を効果的に解決し、明確なクラス階層を維持できます。

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

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