为什么python类方法与它的对象方法不同但是它们都具有相同的id?

Erx*_*xin 1 python methods class

我正在研究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
>>> 
Run Code Online (Sandbox Code Playgroud)

python版本,2.7.5操作系统,win8

为什么'是'测试返回False但id返回相同的值?我期望在开始时看到差异ID.提前致谢!

Len*_*bro 5

id是一个内部实现细节.在id很少使用作为一个程序员使用.在CPython中,它往往是对象的内存地址,在这种情况下,对象是一个函数对象.

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

但它是相同的功能.

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

因为方法比较不一样.即使是自己:

 >>> foo.fun is foo.fun
 False
 >>> f = foo()
 >>> f.fun is f.fun
 False
Run Code Online (Sandbox Code Playgroud)

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

>>> bar = foo
>>> bar.fun.im_func is foo.fun.im_func
True
>>> f.fun.im_func is foo.fun.im_func
True
Run Code Online (Sandbox Code Playgroud)

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

>>> foo.fun is foo.fun
True
Run Code Online (Sandbox Code Playgroud)

绑定方法仍然比较自己错误:

>>> f.fun is f.fun
False
Run Code Online (Sandbox Code Playgroud)

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

>>> f.fun.__func__ is foo.fun
True
Run Code Online (Sandbox Code Playgroud)

  • @thefourtheye:使用14年有帮助. (2认同)