ホームページ > バックエンド開発 > Python チュートリアル > Python のメソッド解決順序 (MRO) は、新しいスタイルのクラスでの明確なメソッド継承をどのように保証するのでしょうか?

Python のメソッド解決順序 (MRO) は、新しいスタイルのクラスでの明確なメソッド継承をどのように保証するのでしょうか?

Barbara Streisand
リリース: 2024-10-31 21:07:01
オリジナル
421 人が閲覧しました

How does Python's Method Resolution Order (MRO) ensure unambiguous method inheritance in new-style classes?

新しいスタイルのクラスにおけるメソッド解決順序 (MRO)

Python のクラスベース プログラミングのコンテキストでは、メソッド解決順序 (MRO) ) は、クラスのインスタンスに対してメソッド検索が実行される順序を定義します。 MRO の実装は、古いスタイルのクラスと新しいスタイルのクラスで異なります。

古いスタイルのクラスの継承

古いスタイルのクラスでは、MRO は深さに従います。最初のアプローチ。サブクラスのインスタンス内のメソッドを検索するとき、インタプリタはサブクラスの継承階層を深さ優先でたどります。基本クラスで最初に出現したメソッドが返されます。

新しいスタイルのクラスの継承

新しいスタイルのクラスの導入により、MRO セマンティクスが C3 に変更されました。線形化。このアプローチにより、継承階層内に同じ基本クラスが複数存在する場合に生じるあいまいさが解消されます。新しいスタイルのクラスの MRO は次のように計算されます:


  1. リーフ クラス (サブクラスを持たないサブクラス) は MRO に配置されます。

  2. すべての基本クラスは、そのサブクラスの前に MRO に追加されます。
  3. MRO 内の各基本クラスについて、そのサブクラスに対して手順 1 ~ 3 を再帰的に繰り返します。 /li>

  4. 多重継承の例

    新しいスタイルのクラスでの多重継承を含む次の例を考えてみましょう:

    この例では、Base1 が継承内で複数回発生していますが、階層構造の場合、Derived の MRO は次のとおりです。

    <code class="python">class Base1(object):
        def amethod(self):
            print("Base1")
    
    class Base2(Base1):
        pass
    
    class Base3(object):
        def amethod(self):
            print("Base3")
    
    class Derived(Base2, Base3):
        pass
    
    instance = Derived()  
    instance.amethod()  
    print(Derived.__mro__) 
    ログイン後にコピー

    この順序は、上で説明した C3 線形化アルゴリズムに対応します。 Derived はリーフ クラスであるため、MRO の最初に配置されます。次に、その基本クラスである Base2 (Base1 のサブクラス) と Base3 がこの順序で追加されます。最後に、オブジェクトが究極の基本クラスとして追加されます。

    (, , , , )

    結論

    新しいスタイルのクラスの MRO は、メソッド継承を解決するための決定論的で明確なメソッドを提供します。これにより、古いスタイルのクラス継承の場合のように、同じ基本クラスが複数回出現することで生じる可能性のある潜在的な曖昧さが排除されます。

以上がPython のメソッド解決順序 (MRO) は、新しいスタイルのクラスでの明確なメソッド継承をどのように保証するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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