新しいスタイルのクラスにおける MRO の明確化
古いものとは異なる-スタイル クラス、新しいスタイル クラスは、その基本クラスをイントロスペクトして、メソッド解決順序 (MRO) を確立します。この順序により、オブジェクトでメソッドが呼び出されたときにメソッドが検索される順序が決まります。
MRO との継承の競合の解決
新しい MRO の主な違いstyle クラスと old-style クラスは、同じ祖先クラスが継承階層内に複数回出現する場合に発生します。たとえば、次のダイヤモンド継承のケースを考えてみましょう:
<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</code>
レガシー スタイル MRO:
レガシー スタイル クラスでは、解決順序は D - B になります。 - A - C - A. ここで、D.amethod() を呼び出すと、A の定義が最初に見つかり、C の定義がオーバーライドされます。
新しいスタイル MRO:
新しいスタイルのクラスの場合、MRO は次のとおりです。
<code class="python">D.__mro__ (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)</code>
A は、この順序ですべてのサブクラスの後に 1 回だけ出現することに注意してください。これにより、C のメソッドのオーバーライドなど、サブクラス内のオーバーライドが確実に優先されます。
MRO の重要性を理解する
新しいスタイルのクラスの MRO は継承の競合を解決します。賢明なことに、オーバーライドが正しく機能するようになります。また、同じメソッドの複数の定義が解決順序に表示され、あいまいな動作につながる状況も回避します。 MRO を理解して効果的に利用することで、開発者は Python で堅牢で保守可能な継承階層を設計できます。
以上が新しいスタイルのクラスのメソッド解決順序 (MRO) は従来のスタイルのクラスとどのように異なり、継承の競合を解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。