Python 3如何将内置对象(在lhs上)与用户定义的对象(在rhs上)进行比较?
内置__eq__
方法是否只是将比较委托给rhs(rhs.__eq__(self)
)?
我在文档中没有找到任何关于此的陈述。 docs州:
不同类型的对象(不同的数字类型除外)从不相等。
这是非常误导,因为:
class X:
def __eq__(self, rhs)
return True
x = X()
'abc' == x # True
我认为应该将文件陈述改写如下:
不同内置类型的对象(不同的数字类型除外)从不相等。
并且应该进一步说明如何执行与用户定义的类实例的比较。
答案 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
。
另见: