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

Barbara Streisand
リリース: 2024-10-28 05:49:02
オリジナル
181 人が閲覧しました

How Does Method Resolution Order (MRO) Differ Between Legacy and New-Style Classes in Python?

レガシー クラスと新しいスタイル クラスのメソッド解決順序 (MRO) の違い

Python の新しいスタイル クラスでは、従来のクラスと比較したメソッド解決順序 (MRO)。提供された例は、新しいスタイルのクラスに対する MRO 解決を正しく示していますが、2 つのアプローチを区別する微妙な違いを詳しく調べてみましょう。

重要な違いは、祖先クラスが「単純な」深さで複数回出現するときに現れます。最初の解決順序。次の「ダイヤモンド継承」の場合を考えてみましょう:

class A:
    x = 'a'

class B(A):
    pass

class C(A):
    x = 'c'

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

従来のクラスを使用すると、解決順序は D - B - A - C - A になります。この順序では、A が最初に検出され、結果として'x' の定義は C の後続の定義によって隠蔽されています。

D.x => 'a'
ログイン後にコピー

ただし、新しいスタイルのクラスは改訂された MRO を採用しています。

D.__mro__ = (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
ログイン後にコピー

この順序により、祖先クラスが確実に表示されます。一度だけ、そしてその後すべてのサブクラス。その結果、C による 'x' の変更などのオーバーライドが優先されます。

D.x => 'c'
ログイン後にコピー

このアプローチでは、解決順序で祖先クラスが複数出現することを回避することで、曖昧さが排除され、複雑な継承階層における直感的な動作が保証されます。これが、特に多重継承やダイヤモンドのようなパターンを扱う場合、新しいスタイルのクラスを優先して古いスタイルのクラスを一般的に避けるべき理由です。

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

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