由于Python不提供比较运算符的左/右版本,它如何决定调用哪个函数?
class A(object):
def __eq__(self, other):
print "A __eq__ called"
return self.value == other
class B(object):
def __eq__(self, other):
print "B __eq__ called"
return self.value == other
>>> a = A()
>>> a.value = 3
>>> b = B()
>>> b.value = 4
>>> a == b
"A __eq__ called"
"B __eq__ called"
False
这似乎调用了两个__eq__
函数。只是在找官方的决策树。
当Python2.x看到
a == b
时,它会尝试以下操作。type(b)
是一个新的样式类,并且type(b)
是type(a)
的一个子类,并且type(b)
重写了__eq__
,则结果是b.__eq__(a)
。type(a)
重写了__eq__
(即type(a).__eq__
不是object.__eq__
),则结果是a.__eq__(b)
。type(b)
已重写__eq__
,则结果为b.__eq__(a)
。__cmp__
的过程。如果它存在,那么当它返回zero
时,对象是相等的。object.__eq__(a, b)
,即True
iffa
和b
是同一个对象。如果任何一个特殊方法返回
NotImplemented
,Python就好像该方法不存在一样。注意最后一步:如果
a
和b
都不重载==
,则a == b
与a is b
相同。从https://eev.ee/blog/2012/03/24/python-faq-equality/
a == b
表达式调用A.__eq__
,因为它存在。它的代码包括self.value == other
。由于int不知道如何将自己与B进行比较,Python尝试调用B.__eq__
,看看它是否知道如何将自己与int进行比较如果修改代码以显示要比较的值:
它将打印:
相关问题 更多 >
编程相关推荐