为什么Python2中未绑定方法的id()会随着每次访问而改变
Python 2.6.5(r265:790632012年10月1日22:07:21) [GCC 4.4.3]为什么Python2中未绑定方法的id()会随着每次访问而改变,python,python-2.x,Python,Python 2.x,Python 2.6.5(r265:790632012年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.fu
>>> 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都不同
这是因为类(旧的或新的)上的方法与描述符
\uuuuu get\uuuu
方法的属性非常相似;关于python 2的代码
foo = FooClass.bar_method
类似于
import types
foo = types.MethodType(FooClass.__dict__['bar_method'], None, FooClass)
它将在每次访问时创建instancemethod(bar\u方法,None,FooClass)
的新实例。原始函数可用作foo.bar\u method.im\u func
和foo.im\u class
中的类实例。绑定方法和未绑定方法的类型相同instancemethod
;如果im\u self
成员为None
,则instancemethod
实例具有repr
,而如果im\u self成员不是None,则repr为
Python 3则不同。未绑定的方法有一个repr
,id总是相同的,也就是说它们只是一般函数。在Python3中,您可以为未绑定的未修饰方法的self
传递任何内容,即使None
,它只是一个名称中带有点的函数。新样式类是否也会发生同样的情况?@Tadeck让我现在试试。编辑:是的。id()是地址是一个不相关的实现细节。我更新了问题以反映这一点。绑定方法不会出现可能的重复。绑定方法的不同实例都有相同的函数对象。你能用代码证明一下吗?没有证据(如文档或工作代码),这只是猜测。@Tadeck,我试过了。请试一试。我使用im_func属性获取与不同绑定方法实例关联的func对象。@t请确认您是对的问题中的行为不会发生在Python3上。在Python2中,未绑定方法不是函数对象。