1

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

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

我在文档中没有找到任何关于此的声明。文档状态:

不同类型的对象,除了不同的数值类型,永远不会比较相等。

这很容易引起误解,因为:

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

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

我认为 doc 声明应该改写如下:

不同内置类型的对象,除了不同的数值类型,永远不会比较相等。

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

4

1 回答 1

3

要回答问题:

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

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

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

不,内置__eq__不会像这样委托。有一个更高层次的结构在起作用,它涵盖了==Python 中的行为。

Given a == b, wherea.__eq__(b) 返回 NotImplementedthenb.__eq__(a)将被调用,并且使用的结果作为相等性测试的结果。(False如果两个__eq__实现都返回,则返回NotImplemented。)

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

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

虽然我不想过多地推测文档(或可能的错误措辞),但我相信如果stdObj.__eq__(obj)stdObj == obj.

也可以看看:

于 2012-09-12T00:59:25.293 回答