python - 为什么 Python 2 中未绑定(bind)方法的 id() 每次访问都会更改

标签 python python-2.x

Python 2.6.5(r265:79063,2012 年 10 月 1 日,22:07:21) [海湾合作委员会 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

为什么每次未绑定(bind)方法的ID都不一样?

不应该一样吗?

最佳答案

这是因为类(旧的或新的)上的方法确实像具有描述符 __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_funcfoo.im_class 中的类实例.绑定(bind)和未绑定(bind)方法的类型相同 instancemethod ;如果im_self成员是None , instancemethod实例具有 repr <unbound method ...> ,而如果 im_self 成员不是 None,则 repr 是 <bound method...>

Python 3 不同。未绑定(bind)的方法有一个 repr <function x.f at 0x7fd419cf69e0>并且 id 始终相同,即它们只是一般函数。在 Python 3 中,您可以为 self 传递任何内容一个未绑定(bind)的未修饰方法,甚至是 None ,它只是一个名称中带有点的函数。

关于python - 为什么 Python 2 中未绑定(bind)方法的 id() 每次访问都会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264578/

相关文章:

python - 用递归找出一对中的目标差异

python - Tensorflow将字符串列转换为多列进行分类

带范围的 Python 列表

python - 如何通过shell激活PyCharm创建的venv?

python - 如何在for循环中编辑列表元素 - python

python - 如何使用 MongoEngine 根据特定条件选择多个对象?

python - __new__ 是检索 SQLAlchemy 对象的好方法吗

python - 来自 turtle 类的 mainloop 函数不起作用,Python

python - 为什么我不能使用带星号的表达式?

python - 按键组合两个大型词典的最快方法是什么?