我对这些代码片段的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
for(2)and(3)为什么它一次又一次地改变id ......这个函数是不是存储在指定的内存位置。
但是块(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中也会有所不同......
答案 0 :(得分:2)
你需要比较基础功能。该方法不是函数。
>>> A.func.__func__ is A.func.__func__
True
这是因为python在函数周围添加了一个包装器(并且似乎不会缓存它们 - 每次请求方法时都会生成一个新的)以执行使self
在方法中正常工作所需的额外魔法。我想记住这叫什么。部分解释是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-objects和http://docs.python.org/2.6/library/stdtypes.html#methods
的额外片段希望知道比我更多的人会发帖(我回复是因为这个很老了,我想我可以指出你正确的方向)。