为什么 '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__
这就是构造绑定方法的原因。
我注意到有时实例方法不比较相同(使用 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__
这就是构造绑定方法的原因。