En Python, ¿el objeto () es igual a cualquier cosa además de sí mismo?

Si tengo el código my_object = object() en Python, ¿ my_object será igual a cualquier cosa excepto a sí mismo?

Sospecho que la respuesta se encuentra en el método __eq__ del objeto predeterminado devuelto por object() . ¿Cuál es la implementación de __eq__ para este objeto predeterminado?

EDITAR: Estoy usando Python 2.7, pero también estoy interesado en las respuestas de Python 3. Aclare si su respuesta se aplica a Python 2, 3 o ambos.

object no implementa __eq__ , por lo que __eq__ a la id(x) == id(y) comparación predeterminada id(x) == id(y) , es decir, ¿ son la misma instancia de objeto ( x is y )?

A medida que se crea una nueva instancia cada vez que llama a object() , my_object nunca * se comparará igual a nada excepto a sí mismo.

Esto se aplica tanto a 2.x como a 3.x:

 # 3.4.0 >>> object().__eq__(object()) NotImplemented # 2.7.6 >>> object().__eq__(object()) Traceback (most recent call last): File "", line 1, in  object().__eq__(object()) AttributeError: 'object' object has no attribute '__eq__' 

* o más bien, como lo roippi la respuesta de roippi , casi nunca , asumiendo implementaciones razonables de __eq__ otros lugares.

object().__eq__ devuelve el singleton NotImplemented :

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

Por las reglas reflexivas de comparaciones ricas , cuando se devuelve NotImplemented , se intenta la operación “reflejada” . Entonces, si tiene un objeto en el RHS que devuelve True para esa comparación, entonces puede obtener una respuesta True aunque el LHS no implementó la comparación.

 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 

bit específico de python 2: si ninguno de los objetos implementa __eq__ , python se mueve para verificar si implementa __cmp__ . Aquí se aplican reglas reflexivas equivalentes.

 class ComparableToEverything(object): def __cmp__(self,other): return 0 cte = ComparableToEverything() cte == object() Out[5]: True object() == cte Out[6]: True 

__cmp__ se ha ido en python 3.

Tanto en Python 2 como en 3, cuando NotImplemented todos estos operadores de comparación y todos no están NotImplemented , el último recurso es verificar la identidad. ( a is b )