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成员是None,则instancemethod实例具有 repr <unbound method ...>,而如果 im_self 成员不是 None ,则 repr 是<bound method...>

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

于 2013-08-16T01:53:14.943 回答