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都不同?
不应该一样吗?
答案 0 :(得分: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
成员是None
,则instancemethod
实例具有repr <unbound method ...>
,而如果im_self成员不是None,则repr为<bound method...>
Python 3与众不同。未绑定的方法有一个repr <function x.f at 0x7fd419cf69e0>
,id总是相同的,即它们只是一般函数。在Python 3中,您可以为未绑定的未修饰方法self
传递任何内容,甚至是None
,它只是一个名称中带点的函数。