Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python2中未绑定方法的id()会随着每次访问而改变_Python_Python 2.x - Fatal编程技术网

为什么Python2中未绑定方法的id()会随着每次访问而改变

为什么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

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.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中,未绑定方法不是函数对象。