メソッドが参照の等価性を示さないのはなぜですか?
Python では、関数は参照の等価性を維持しますが、メソッドはそうではありません。この相違は、メソッドの作成方法に起因します。
メソッドの作成
関数とは異なり、メソッド オブジェクトはアクセスされるたびにインスタンス化されます。これは、メソッドは本質的に記述子であり、その .__get__ メソッドが呼び出されたときにメソッド オブジェクトを返すためです。
What.__dict__['meth'] # Function (not method) object What.__dict__['meth'].__get__(What(), What) # Method object
メソッド同等性テスト
Python 3.8 以降、メソッドの同等性は、.__self__ 属性と .__func__ 属性を比較することによって判断されます。同じ関数とインスタンスを参照する場合、それらのメソッドは等しいとみなされます。ただし、3.8 より前では、メソッドの等価性の動作はメソッドの実装に応じて一貫性がありませんでした。
影響
メソッドの等価性のこの変動は、いくつかのシナリオに影響します。
関数のアイデンティティをテストするためのソリューション
メソッドが同じ基になる関数を表すかどうかをテストするには、次のようにします。 .__func__ 属性を比較できます:
What().meth.__func__ == What().meth.__func__
以上がPython ではメソッドが参照の等価性を示さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。