4

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

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......这个函数没有存储在指定的内存位置。

但是块 (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中也不同......

4

1 回答 1

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

希望比我了解更多的人会发布(我正在回复,因为这已经很老了,我想我可以为您指出正确的大方向)。

于 2013-07-01T13:03:08.913 回答