1

在我学习python 属性和方法的同时,阅读示例 1.2。一个功能就是更多。我尝试在示例的基础上做一个简单的测试,但结果让我有点困惑。

>>> class foo(object):
...     def fun(self):
...         pass
...     
>>> f = foo()
>>> f.fun is foo.fun
False
>>> id(f.fun) 
36093064
>>> id(foo.fun)
36093064
>>> 

python版,2.7.5操作系统,win8

为什么 'is' 测试返回 False 但 id 返回相同的值?我希望在一开始就看到不同的 ID。提前致谢!

4

1 回答 1

5

id是一个内部实现细节。用作程序员的id用处不大。在 CPython 中,它往往是对象的内存地址,在这种情况下,对象是一个函数对象。

在这种情况下,对象是相同的,它是一个函数。在一种情况下,函数绑定到一个实例,在另一种情况下则没有。这意味着当你调用它时,在绑定的情况下它会自动获取实例作为第一个参数,而在第二种情况下不会。

但它是相同的功能。

那么为什么f.fun is foo.fun返回False呢?

因为方法比较不一样。即使是他们自己:

 >>> foo.fun is foo.fun
 False
 >>> f = foo()
 >>> f.fun is f.fun
 False

这是因为这些对象是包装器。如果要比较方法,请比较 im_func 属性:

>>> bar = foo
>>> bar.fun.im_func is foo.fun.im_func
True
>>> f.fun.im_func is foo.fun.im_func
True

在 Python 3 中,未绑定的方法消失了,使用了普通函数。所以在 Python 3 中你会得到:

>>> foo.fun is foo.fun
True

绑定的方法仍然与自己比较为假:

>>> f.fun is f.fun
False

您需要使用__func__属性进行比较:

>>> f.fun.__func__ is foo.fun
True
于 2013-08-27T09:35:55.923 回答