为什么 'is' 在比较 python 中的实例方法时不起作用

Why does 'is' not work when comparing instance methods in python

我注意到有时实例方法不比较相同(使用 is 而不是 ==),即使它们与相同的绑定实例方法相关,例如

>>> class A(object):
...     def f(self):
...             print "hi"
... 
>>> a = A()
>>> f1 = a.f
>>> f2 = a.f
>>> f1 is f2
False
>>> f1 == f2
True

我最终使用 == 检查两个变量是否引用相同的绑定方法,但我想知道是否有人知道为什么 is 的行为与我预期的不同?

方法实现为 descriptors -- 因此每次访问 f 成员时,都会创建一个新函数。您可以通过查看他们的 ID 来了解这一点...

>>> class A(object):
...     def f(self):
...         pass
... 
>>> a = A()
>>> f1 = a.f
>>> f2 = a.f
>>> id(f1)
4325305232
>>> id(f2)
4325818528

为了更清楚地说明我所说的它们是通过描述符实现的意思,以下表达式:

a = A()
func = a.f

相当于:

a = A()
func = A.f.__get__(a, A)

显然你不想一直写后者,所以快捷方式非常好:-)。

话虽如此,这开始解释绑定方法如何知道 self 是什么,因为 a(方法中的 self)被传递给 __get__ 这就是构造绑定方法的原因。