Python の新しいスタイルのクラスではメソッド解決順序 (MRO) がどのように異なりますか?

Susan Sarandon
リリース: 2024-10-30 04:38:02
オリジナル
441 人が閲覧しました

How Does Method Resolution Order (MRO) Differ in Python's New-Style Classes?

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

Python では、メソッド解決順序 (MRO) によって継承の順序が決まります。チェーンでメソッド属性が検索されます。古いスタイルのクラスの MRO は単純な深さ優先アプローチに従いますが、新しいスタイルのクラスでは、複数の継承がより直観的に機能するように変更された順序が導入されています。

新しいスタイル クラスの MRO の違い

レガシー スタイルのクラスの単純な深さ優先アプローチで同じ祖先クラスが複数回出現する場合、その祖先クラスはそのサブクラスよりも優先されます。次の「ダイヤモンド継承」の例を考えてみましょう:

<code class="python">class A:
    x = 'a'

class B(A):
    pass

class C(A):
    x = 'c'

class D(B, C):
    pass</code>
ログイン後にコピー

レガシー スタイルでは、D.x の解決順序は D - B - A - C - A です。したがって、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 による x のオーバーライドなど、サブクラスでのオーバーライドが有効になります。

継承への影響

新しいスタイルのクラスの MRO の違いは、次の点に重要な影響を及ぼします。多重継承。レガシー スタイルのクラスは、ダイヤモンドの継承パターンで競合が発生する傾向があります。対照的に、新しいスタイルのクラスは多重継承をより柔軟に処理し、オーバーライドが期待どおりに動作することを可能にします。

したがって、古いスタイルのクラスを避け、代わりに新しいスタイルのクラスを使用することをお勧めします。新しいスタイルのクラスにより、多重継承が直感的に機能し、メソッド解決における予期せぬ競合が防止されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!