新しいスタイルのクラスにおけるメソッド解決順序 (MRO)
Python のクラスベース プログラミングのコンテキストでは、メソッド解決順序 (MRO) ) は、クラスのインスタンスに対してメソッド検索が実行される順序を定義します。 MRO の実装は、古いスタイルのクラスと新しいスタイルのクラスで異なります。
古いスタイルのクラスの継承
古いスタイルのクラスでは、MRO は深さに従います。最初のアプローチ。サブクラスのインスタンス内のメソッドを検索するとき、インタプリタはサブクラスの継承階層を深さ優先でたどります。基本クラスで最初に出現したメソッドが返されます。
新しいスタイルのクラスの継承
新しいスタイルのクラスの導入により、MRO セマンティクスが C3 に変更されました。線形化。このアプローチにより、継承階層内に同じ基本クラスが複数存在する場合に生じるあいまいさが解消されます。新しいスタイルのクラスの MRO は次のように計算されます:
新しいスタイルのクラスでの多重継承を含む次の例を考えてみましょう:
この例では、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 サイトの他の関連記事を参照してください。