メソッド オブジェクトは、アクセスするたびに作成されます。関数は記述子として機能し、.__get__
メソッドが呼び出されたときにメソッド オブジェクトを返します。
>>> What.__dict__['meth']
<function What.meth at 0x10a6f9c80>
>>> What.__dict__['meth'].__get__(What(), What)
<bound method What.meth of <__main__.What object at 0x10a6f7b10>>
Python 3.8 以降を使用している場合は、==
代わりに等価性テストを使用できます。Python 3.8 以降では、.__self__
および.__func__
属性が同一のオブジェクトである場合、2 つのメソッドは同等です (したがって、同じ関数をラップし、同じインスタンスにバインドされている場合、両方とも でテストされますis
)。
3.8 より前で==
は、メソッドの実装方法に基づいてメソッドの動作に一貫性がありませんでした。Python メソッドと 2 つの C メソッド タイプの 1 つ__self__
は同一性ではなく等しいかどうかで比較され、もう 1 つの C メソッド タイプは同一性で比較__self__
されます。Python の問題 1617161を参照してください。
メソッドが同じ基礎となる関数を表していることをテストする必要がある場合は、それらの__func__
属性をテストします。
>>> What.meth == What.meth # functions (or unbound methods in Python 2)
True
>>> What().meth == What.meth # bound method and function
False
>>> What().meth == What().meth # bound methods with *different* instances
False
>>> What().meth.__func__ == What().meth.__func__ # functions
True