define - list api python
¿Cómo se maneja__eq__ en Python y en qué orden? (2)
Cuando Python2.x ve a == b , intenta lo siguiente.
- Si el
type(b)es una clase de nuevo estilo, y eltype(b)es una subclase detype(a), y eltype(b)ha anulado__eq__, entonces el resultado esb.__eq__(a). - Si el
type(a)ha anulado__eq__(es decir,type(a).__eq__no es elobject.__eq__), entonces el resultado esa.__eq__(b). - Si el
type(b)ha anulado__eq__, entonces el resultado esb.__eq__(a). - Si ninguno de los anteriores es el caso, Python repite el proceso buscando
__cmp__. Si existe, los objetos son iguales si devuelvezero. - Como último recurso, Python llama al
object.__eq__(a, b), que esTruesiobject.__eq__(a, b)ybson el mismo objeto.
Si alguno de los métodos especiales devuelve NotImplemented , Python actúa como si el método no existiera.
Tenga en cuenta que el último paso es cuidadoso: si ni a ni b sobrecarga == , entonces a == b es lo mismo que a is b .
Dado que Python no proporciona versiones de izquierda / derecha de sus operadores de comparación, ¿cómo decide qué función llamar?
class A(object):
def __eq__(self, other):
print "A __eq__ called"
return self.value == other
class B(object):
def __eq__(self, other):
print "B __eq__ called"
return self.value == other
>>> a = A()
>>> a.value = 3
>>> b = B()
>>> b.value = 4
>>> a == b
"A __eq__ called"
"B __eq__ called"
False
Esto parece llamar a ambas funciones __eq__ . Solo estoy buscando el árbol de decisión oficial.
La expresión a a == b invoca A.__eq__ , ya que existe. Su código incluye self.value == other . Como las int no saben cómo compararse con las B, Python intenta invocar B.__eq__ para ver si sabe cómo compararse con una int.
Si modifica su código para mostrar qué valores se comparan:
class A(object):
def __eq__(self, other):
print "A __eq__ called: %r == %r ?" % (self, other)
return self.value == other
class B(object):
def __eq__(self, other):
print "B __eq__ called: %r == %r ?" % (self, other)
return self.value == other
a = A()
a.value = 3
b = B()
b.value = 4
a == b
se imprimirá:
A __eq__ called: <__main__.A object at 0x013BA070> == <__main__.B object at 0x013BA090> ?
B __eq__ called: <__main__.B object at 0x013BA090> == 3 ?