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 esTrue
siobject.__eq__(a, b)
yb
son 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 ?