これはid
内部実装の詳細です。id
プログラマーとして使用するのはほとんど役に立ちません。CPython では、オブジェクトのメモリ アドレスになる傾向があり、この場合のオブジェクトは関数オブジェクトです。
この場合、オブジェクトは同じで、関数です。関数がインスタンスにバインドされている場合もあれば、バインドされていない場合もあります。これは、それを呼び出すと、バインドされたケースではインスタンスが最初のパラメーターとして自動的に取得され、2 番目のケースでは取得されないことを意味します。
でも同じ機能です。
では、なぜ がf.fun is foo.fun
返されるのFalse
でしょうか?
方法は同じではないと比較されるからです。自分自身でも:
>>> foo.fun is foo.fun
False
>>> f = foo()
>>> f.fun is f.fun
False
これは、これらのオブジェクトがラッパーであるためです。メソッドを比較する場合は、im_func 属性を比較します。
>>> bar = foo
>>> bar.fun.im_func is foo.fun.im_func
True
>>> f.fun.im_func is foo.fun.im_func
True
Python 3 では unbound メソッドがなくなり、通常の関数が使用されます。したがって、Python 3 では次のようになります。
>>> foo.fun is foo.fun
True
バインドされたメソッドは、それ自体に対してまだ false と比較されます。
>>> f.fun is f.fun
False
__func__
そして、次の属性を使用して比較する必要があります。
>>> f.fun.__func__ is foo.fun
True