内置和用户定义类型之间的Python比较

时间:2012-09-12 00:46:41

标签: python class python-3.x comparison built-in

Python 3如何将内置对象(在lhs上)与用户定义的对象(在rhs上)进行比较?

内置__eq__方法是否只是将比较委托给rhs(rhs.__eq__(self))?

我在文档中没有找到任何关于此的陈述。 docs州:

  

不同类型的对象(不同的数字类型除外)从不相等。

这是非常误导,因为:

class X:
  def __eq__(self, rhs)
    return True

x = X()
'abc' == x # True

我认为应该将文件陈述改写如下:

  

不同内置类型的对象(不同的数字类型除外)从不相等。

并且应该进一步说明如何执行与用户定义的类实例的比较。

1 个答案:

答案 0 :(得分:3)

回答问题:

  

Python 3如何将内置对象(在lhs上)与用户定义的对象(在rhs上)进行比较?

与任何其他对象比较相同(包括None!)。

  

内置__eq__方法是否只是将比较委托给rhs(rhs.__eq__(self))?

没有。内置__eq__执行委托。工作中有一个更高层次的构造,涵盖了Python中==的行为。

鉴于a == b,其中a.__eq__(b) 返回 NotImplemented,则会调用b.__eq__(a)并将结果用作相等的结果测试。 (如果False个实现都返回__eq__,则会返回NotImplemented。)

因此,给定x(类X),并且"abc".__eq__(x) 返回 NotImplemented,则x.__eq__("abc")为调用(并根据问题评估为True)。

这同样适用于其他标准比较运算符。

虽然我不想过多地猜测文档(或可能的误写),但我认为如果stdObj.__eq__(obj)的上下文中采用,则完全准确 stdObj == obj

另见: