在Python中,object()是否等于除了它自己之外的任何东西?

时间:2014-05-16 20:15:49

标签: python

如果我在Python中使用代码my_object = object()my_object除了它自己以外会等于什么吗?

我怀疑答案在于__eq__返回的默认对象的object()方法。这个默认对象的__eq__的实现是什么?

编辑:我正在使用Python 2.7,但我也对Python 3的答案感兴趣。请澄清您的答案是否适用于Python 2,3或两者。

2 个答案:

答案 0 :(得分:28)

object().__eq__返回NotImplemented单身:

print(object().__eq__(3))
NotImplemented

根据rich comparisons的反身规则,在返回NotImplementedthe "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__' 实施。