ホームページ  >  記事  >  バックエンド開発  >  Python の従来のクラスと新しいスタイルのクラスではメソッド解決順序 (MRO) がどのように異なりますか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 05:49:02172ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。