El objeto ‘super’ no tiene atributo ‘__eq__’

Cuando bash anular el método mágico __eq__ , y uso super para acceder al método base que se encuentra en el object , __eq__ un error. No hay forma de que esto sea un error, pero seguro que se siente como uno:

 class A(object): def __eq__(self, other): return super(A, self).__eq__(other) A() == 0 # raises AttributeError: 'super' object has no attribute '__eq__' 

Esto no es intuitivo porque el object.__eq__ existe, pero para la class A(object): pass no. Si no me equivoco, __eq__ recurre a un cheque, por lo que puede ser la solución aquí, pero usar en lugar de super no es amigable con la mezcla. Ir por ese camino está bien en mi caso, pero en otros podría no serlo.

Cualquier sugerencia o información sobre por qué __eq__ funciona de esta manera sería genial.

Como se señaló en la respuesta de Will, object() realidad no implementa __eq__ para las instancias (en Python 2.7).

Usted está siendo engañado por el hecho de que el object.__eq__ existe para creer que debe ser un método que verifique si las instancias del objeto son iguales

En su lugar, object.__eq__ es en realidad un método de clase, heredado de type , que se usa para verificar si los tipos son iguales.

Es decir, para manejar expresiones como object == int y object == object .

Esto se debe a que object() realidad no implementa un __eq__() . El “default” aquí sería:

 class A(object): def __eq__(self, other): if self is other: return True return self == other 

Pero, si lo que está intentando ha funcionado, en realidad estaría verificando si la instancia self de la clase padre era igual a other . Y, es el mismo objeto ( self ), por lo que sería. Entonces el equivalente más cercano de tu código sería en realidad:

 class A(object): def __eq__(self, other): if self is other: return True return super(A, self) == other