「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 新しいスタイルのクラスのメソッド解決順序 (MRO) は従来のスタイルのクラスとどのように異なり、継承の競合を解決しますか?

新しいスタイルのクラスのメソッド解決順序 (MRO) は従来のスタイルのクラスとどのように異なり、継承の競合を解決しますか?

2024 年 11 月 15 日に公開
ブラウズ:639

How does Method Resolution Order (MRO) in New-Style Classes differ from Legacy-Style Classes and resolve inheritance conflicts?

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

新しいスタイルのクラスにおける MRO の明確化

以前とは異なり-スタイル クラス、新しいスタイル クラスは、その基本クラスをイントロスペクトして、メソッド解決順序 (MRO) を確立します。この順序により、オブジェクトでメソッドが呼び出されたときにメソッドが検索される順序が決まります。

MRO との継承競合の解決

新しい MRO の主な違いstyle クラスと old-style クラスは、同じ祖先クラスが継承階層内に複数回出現する場合に発生します。たとえば、次のダイヤモンド継承のケースを考えてみましょう:

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

レガシースタイル MRO:

レガシースタイルのクラスでは、解決順序は D - B - A - C - A になります。ここで、D を呼び出すときは、 .amethod()、A の定義が最初に見つかり、C.

New-Style の定義をオーバーライドします。 MRO:

新しいスタイルのクラスの場合、MRO は次のとおりです:

D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)

A は、この順序でそのすべてのサブクラスの後に 1 回だけ出現することに注意してください。これにより、C のメソッドのオーバーライドなど、サブクラス内のオーバーライドが確実に優先されます。

MRO の重要性を理解する

新しいスタイルのクラスの MRO は継承の競合を解決します。賢明なことに、オーバーライドが正しく機能するようになります。また、同じメソッドの複数の定義が解決順序に表示され、あいまいな動作につながる状況も回避します。 MRO を理解して効果的に利用することで、開発者は Python で堅牢で保守可能な継承階層を設計できます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3