如果我在Python中使用代码my_object = object()
,my_object
除了它自己以外会等于什么吗?
我怀疑答案在于__eq__
返回的默认对象的object()
方法。这个默认对象的__eq__
的实现是什么?
答案 0 :(得分:28)
object().__eq__
返回NotImplemented
单身:
print(object().__eq__(3))
NotImplemented
根据rich comparisons的反身规则,在返回NotImplemented
时the "reflected" operation is tried。因此,如果您在RHS上有一个返回True
进行比较的对象,那么即使LHS没有实施比较,您也可以获得True
响应。
class EqualToEverything(object):
def __eq__(self,other):
return True
ete = EqualToEverything()
ete == object() # we implemented `ete.__eq__`, so this is obviously True
Out[74]: True
object() == ete # still True due to the reflexive rules of rich comparisons
Out[75]: True
python 2特定位:如果 对象都没有实现__eq__
,那么python会继续检查是否实现__cmp__
。等效反身规则适用于此。
class ComparableToEverything(object):
def __cmp__(self,other):
return 0
cte = ComparableToEverything()
cte == object()
Out[5]: True
object() == cte
Out[6]: True
__cmp__
在python 3中消失了。
在python 2和3中,当我们耗尽所有这些比较运算符并且都是NotImplemented
时,最终的回退是检查身份。 (a is b
)
答案 1 :(得分:18)
object
未实现__eq__
,因此请回到默认比较id(x) == id(y)
,即它们是相同的对象实例({{1} })?
每次拨打x is y
时都会创建一个新实例,object()
永远不会*等同于除自身以外的任何内容。
这适用于2.x和3.x:
my_object
*或者更确切地说,正如roippi
's answer指出的那样,几乎没有,假设其他地方有合理的# 3.4.0
>>> object().__eq__(object())
NotImplemented
# 2.7.6
>>> object().__eq__(object())
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
object().__eq__(object())
AttributeError: 'object' object has no attribute '__eq__'
实施。