与方法相关的python代码行为

我对这些代码片段的
python解释器中发生的事情有点困惑……我使用的是32位版本的python 2.7.3

class A:
    def func(self):
        print 'in func'


>>> A.func
>>> <unbound method A.f>
>>> A.__dict__['func']
>>> <function func at 0x013DF9B0>
>>> a = A()
>>> a.func
>>> <bound method A.func of <__main__.A instance at 0x014076C0>>

直到这里一切都还可以……但我对以下代码片段的结果感到困惑…在python 2.7.3中

(1)

>>> A.__dict__['func'] is A.func
>>> False
>>> A.func is A.func
>>> False
>>> a.func is A.func
>>> False
>>> a.func is a.func
>>> False

为什么一切都返回False,即使只有一个类对象(A)和类类型的对象的单个实例(a).

(2)

>>> id(A.func)
>>> 20953208
>>> id(A.func)
>>> 20954728
>>> id(A.func)
>>> 20960080

(3)

>>> id(a.func)
>>> 20954288
>>> id(a.func)
>>> 20952888
>>> id(a.func)
>>> 20954728 

对于(2)和(3),为什么它一次又一次地改变id …这个函数是不是存储在指定的存储位置.

但是block(1)的相同代码在32位版本的python 3.3.1中给出了这个结果

>>> A.__dict__['func'] is A.func
>>> True
>>> A.func is A.func
>>> False
>>> a.func is A.func
>>> False
>>> a.func is a.func
>>> False

谁能告诉我细节,这些结果对于不同版本的python会有什么不同,以及为什么它在同一版本的python中也会有所不同……

最佳答案 你需要比较基础功能.该方法不是功能.

>>> A.func.__func__ is A.func.__func__
True

这是因为python在函数周围添加了一个包装器(并且看起来不会缓存它们 – 每次请求方法时都会生成一个新的函数)来执行使自己在方法中正常工作所需的额外魔法.我想记住这叫什么.部分解释是在http://docs.python.org/2.6/reference/datamodel.html(向下滚动到“用户定义的方法”),但我确定在某处有更好的解释.

额外的碎片在http://docs.python.org/2.6/tutorial/classes.html#method-objects http://docs.python.org/2.6/c-api/method.html#method-objectshttp://docs.python.org/2.6/library/stdtypes.html#methods

希望有一个比我更了解的人会发帖(我回答是因为这很老了,我想我可以指出你正确的方向).

点赞