ホームページ  >  記事  >  バックエンド開発  >  Python ではメソッドが参照の等価性を示さないのはなぜですか?

Python ではメソッドが参照の等価性を示さないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 00:00:291020ブラウズ

Why Do Methods Not Exhibit Reference Equality in Python?

メソッドが参照の等価性を示さないのはなぜですか?

Python では、関数は参照の等価性を維持しますが、メソッドはそうではありません。この相違は、メソッドの作成方法に起因します。

メソッドの作成

関数とは異なり、メソッド オブジェクトはアクセスされるたびにインスタンス化されます。これは、メソッドは本質的に記述子であり、その .__get__ メソッドが呼び出されたときにメソッド オブジェクトを返すためです。

What.__dict__['meth']  # Function (not method) object
What.__dict__['meth'].__get__(What(), What)  # Method object

メソッド同等性テスト

Python 3.8 以降、メソッドの同等性は、.__self__ 属性と .__func__ 属性を比較することによって判断されます。同じ関数とインスタンスを参照する場合、それらのメソッドは等しいとみなされます。ただし、3.8 より前では、メソッドの等価性の動作はメソッドの実装に応じて一貫性がありませんでした。

影響

メソッドの等価性のこの変動は、いくつかのシナリオに影響します。

  • is 演算子を使用してメソッドが同一かどうかをチェックすると、メソッドが同じインスタンスと関数にバインドされていない限り、False が返されます。
  • 逆に、Python 3.8 のメソッドの == 等価性テストは、 .__self__ 属性と .__func__ 属性を比較することで、期待される結果が得られます。

関数のアイデンティティをテストするためのソリューション

メソッドが同じ基になる関数を表すかどうかをテストするには、次のようにします。 .__func__ 属性を比較できます:

What().meth.__func__ == What().meth.__func__

以上がPython ではメソッドが参照の等価性を示さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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