与方法相关的python代码行为

时间:2013-07-01 10:12:54

标签: python python-2.7 python-3.x

我对这些代码片段的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中也会有所不同......

1 个答案:

答案 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-objectshttp://docs.python.org/2.6/library/stdtypes.html#methods

的额外片段

希望知道比我更多的人会发帖(我回复是因为这个很老了,我想我可以指出你正确的方向)。