overlaps chart python equality python-2.x

chart - precedencia de igualdad de Python



title in figure python (1)

class L(object): def __eq__(self, other): print ''invoked L.__eq__'' return False class R(object): def __eq__(self, other): print ''invoked R.__eq__'' return False left = L() right = R()

Con este código, el lado izquierdo obtiene el primer disparo en comparación, como se documented en el modelo de datos:

>>> left == right invoked L.__eq__ False

Pero si hacemos una ligera modificación en la línea 6 (todo lo demás es igual):

class R(L):

Ahora el lado derecho llega a tener el primer disparo en comparación.

>>> left == right invoked R.__eq__ False

¿Porqué es eso? ¿Dónde está documentado y cuál es el motivo de la decisión de diseño?


Esto se documenta en las operaciones numéricas , más abajo en la página, con una explicación de por qué funciona de esa manera:

Nota: Si el tipo del operando derecho es una subclase del tipo del operando izquierdo y esa subclase proporciona el método reflejado para la operación, este método se llamará antes que el método no reflejado del operando izquierdo. Este comportamiento permite que las subclases anulen las operaciones de sus ancestros.

La documentación de Python 3 también lo menciona en la sección que estaba viendo:

Si los operandos son de diferentes tipos, y el tipo del operando derecho es una subclase directa o indirecta del tipo del operando izquierdo, el método reflejado del operando derecho tiene prioridad; de lo contrario, el método del operando izquierdo tiene prioridad. No se considera la subclasificación virtual.