8

Python 2.6.5 (r265:79063、2012 年 10 月 1 日、22:07:21) [GCC 4.4.3]

>>> class myclass:
...     def func(self):
...             pass

>>> dd = myclass.func
>>> ee = myclass.func
>>> cc = myclass.func
>>> ff = myclass.func
>>> ss = myclass.func
>>> uu = myclass.func
>>> pp = myclass.func
>>> 
>>> 
>>> id(dd) ; id(cc) ; id(ee) ; id(ff) ; id(ss) ; id(uu) ; id(pp)
3074535252L
3074534772L
3074522444L
3074531732L
3074497588L
3073003604L
3073003724L

バインドされていないメソッドの ID が毎回異なるのはなぜですか?

それは同じであるべきではありませんか?

4

1 に答える 1

6

これは、クラス (古いまたは新しい) のメソッドが記述子__get__メソッドを持つ属性のように機能するためです。Python 2のコード

foo = FooClass.bar_method

に類似している

import types
foo = types.MethodType(FooClass.__dict__['bar_method'], None, FooClass)

アクセスごとに の新しいインスタンスを作成しinstancemethod(bar_method, None, FooClass)ます。元の関数はFooClass.bar_method.im_func、 のクラス インスタンスとして利用できますfoo.im_class。バインドされたメソッドとバインドされていないメソッドの型は同じinstancemethodです。im_selfメンバーがの場合Noneinstancemethodインスタンスは reprを持ち、 <unbound method ...>im_self メンバーが None でない場合、repr は<bound method...>

Python 3 は異なります。バインドされていないメソッドには repr が<function x.f at 0x7fd419cf69e0>あり、id は常に同じです。つまり、それらは単なる一般的な関数です。selfPython 3 では、バインドされていないデコレートされていないメソッドのfor に何でも渡すことができますNone。名前にドットが含まれる単なる関数です。

于 2013-08-16T01:53:14.943 に答える