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/