新しいスタイルのクラスにおける 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