1

Python の属性とメソッドを勉強しているときに、例 1.2を読んでください。機能は以上です。この例に基づいて簡単なテストを実行しようとしましたが、結果は少し混乱しました。

>>> class foo(object):
...     def fun(self):
...         pass
...     
>>> f = foo()
>>> f.fun is foo.fun
False
>>> id(f.fun) 
36093064
>>> id(foo.fun)
36093064
>>> 

Python バージョン、2.7.5 動作 sys、win8

「is」テストが False を返すのに、id が同じ値を返すのはなぜですか? 最初はIDの違いが見られると思っていました。前もって感謝します!

4

1 に答える 1

5

これは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
于 2013-08-27T09:35:55.923 に答える