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

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

Python 3 如何将内置对象(在左侧)与用户定义的对象(在右侧)进行比较?

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

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

Objects of different types, except different numeric types, never compare equal.

这很有误导性,因为:

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

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

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

Objects of different built-in types, except different numeric types, never compare equal.

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

最佳答案

回答问题:

How does Python 3 compare a built-in object (on the lhs) to a user-defined object (on the rhs)?

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

Does the built-in __eq__ method simply delegate the comparison to the rhs (rhs.__eq__(self))?

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

给定 a == b,其中 a.__eq__(b) 返回 NotImplemented 然后 b.__eq__(a) 将被调用,并将其结果用作相等测试的结果。 (如果两个 __eq__ 实现都返回 NotImplemented,则返回 False。)

因此,给定 x (属于 X 类),并给定 "abc".__eq__(x) 返回 NotImplemented,然后调用 x.__eq__("abc")(并且根据问题计算结果为 True)。

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

虽然我不想对文档进行太多推测(或可能的措辞错误),但我相信如果在 stdObj.__eq__(obj ) 而不是 stdObj == obj

另请参阅:

关于Python 内置类型和用户定义类型之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379840/

相关文章:

Python MySQL 插入或更新变量

c++ - 无法在 C++ 类中创建构造函数

python - 在 Django 中通过 self.request.user 过滤对象列表

matlab - 从子类更改父类(super class)的属性

python - tkinter Canvas 图像不显示

python - 如何在 python 3 中将浮点字符串转换为整数

python - 如何从字符串中正确获取价格

python - 删除 pandas python 中的方括号以导出到 csv

python - 访问字典,用字典中的信息替换用户输入中的项目

python - 导入 basemap 时出现ImportError