ホームページ  >  記事  >  バックエンド開発  >  新しいスタイルの Python クラスの MRO が期待どおりに動作しないのはなぜですか?

新しいスタイルの Python クラスの MRO が期待どおりに動作しないのはなぜですか?

DDD
DDDオリジナル
2024-11-03 22:42:02618ブラウズ

Why Does the MRO in My New-Style Python Class Not Behave as Expected?

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

Python では、メソッド解決順序 (MRO) によってメソッドが解決される方法が決まります相続の場合。新しいスタイルのクラスでは、Python in a Nutshell (第 2 版) のドキュメントで説明されているように、MRO は特定のルールに従います。

指定された例では、コードは新しいスタイルのクラス構文を使用していますが、MRO は古いスタイルのクラスであるかのように動作します。新しいスタイルのクラスに期待される MRO では、この矛盾を修正するために Base1 の前に Base3 を配置する必要があります。

古いスタイルのクラスと新しいスタイルのクラスの MRO の主な違いは、同じ祖先が存在する場合に多重継承を処理する方法にあります。クラスが複数回出現します。古いスタイルのクラスでは、深さ優先のアプローチによりメソッドが正しく解決されない可能性がありました。ただし、新しいスタイルのクラスでは、この本で説明されているダイヤモンド継承パターンは正しく処理されます。

たとえば、次のダイヤモンド継承階層を考えてみましょう。

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

class B(A):
    pass

class C(A):
    x = 'c'

class D(B, C):
    pass</code>

古いスタイルのクラスの場合の場合、MRO は D - B - A - C - A となり、D の x の値は「a」になります。ただし、新しいスタイルのクラスでは、MRO は D - B - C - A - オブジェクトであり、C を A の前に置き、C 内の x のオーバーライドを有効にします。これにより、ダイアモンド継承の問題が解決されます。

したがって、指定された例の正しい MRO は Derived - Base2 - Base1 - Base3 - object ですが、現在のコードではあいまいな MRO 動作により誤った結果が生成されます。これを修正するには、クラス構文を更新して、クラスがオブジェクトから継承して期待される MRO セマンティクスを呼び出すことを明示的に指定する必要があります。

以上が新しいスタイルの Python クラスの MRO が期待どおりに動作しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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