Python如何处理eq,顺序是什么?

2024-04-25 16:37:40 发布

您现在位置:Python中文网/ 问答频道 /正文

由于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__函数。只是在找官方的决策树。


Tags: 函数self版本falsereturn官方objectvalue
2条回答

当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)
  • 如果以上都不是,Python将重复寻找__cmp__的过程。如果它存在,那么当它返回zero时,对象是相等的。
  • 作为最后的回退,Python调用object.__eq__(a, b),即Trueiff ab是同一个对象。

如果任何一个特殊方法返回NotImplemented,Python就好像该方法不存在一样。

注意最后一步:如果ab都不重载==,则a == ba 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进行比较

如果修改代码以显示要比较的值:

class A(object):
    def __eq__(self, other):
        print("A __eq__ called: %r == %r ?" % (self, other))
        return self.value == other
class B(object):
    def __eq__(self, other):
        print("B __eq__ called: %r == %r ?" % (self, other))
        return self.value == other

a = A()
a.value = 3
b = B()
b.value = 4
a == b

它将打印:

A __eq__ called: <__main__.A object at 0x013BA070> == <__main__.B object at 0x013BA090> ?
B __eq__ called: <__main__.B object at 0x013BA090> == 3 ?

相关问题 更多 >