HOWTO · Python
Método __eq__ en Python
Este tutorial muestra cómo puede aprender sobre el método __eq__ en Python
En esta página
Esta guía mostrará cómo manejamos el método __eq__() en Python. Complejaremos diferentes objetos y aprenderemos la funcionalidad de este método en particular. Vamos a sumergirnos en eso.
__eq__() en Python
Primero, __eq__() es un método dunder/magic, como puede ver, está precedido y seguido por guiones bajos dobles. Cada vez que usa el operador ==, este método ya se llama para comparar dos instancias de clase. Python usará el operador is para comparar si no proporciona una implementación específica para el método __eq__(). Pero, ¿cómo se especifica este método? La respuesta a eso radica en anular esta función. Echa un vistazo al siguiente código.
# __eq__ this is called dunder/magic method in python
# class of student has constructor with two arguments
class Student:
def __init__(self, name, roll):
self.name = name
self.roll = roll
# object one of class student
s1 = Student("David", 293)
# object two of class student
s2 = Student("David", 293)
# Applying equality function two objects
print(s1 == s2)
Producción :
False
Como puede ver, creamos una clase llamada Student e hicimos dos de sus argumentos como name y roll. Más tarde, creó dos instancias con los mismos datos de la clase Student. Comparar estas dos instancias como lo hemos hecho en el código anterior dará un resultado false.
A pesar de que estas instancias tienen los mismos datos, no son iguales una vez comparadas. Es porque el operador == compara la dirección de los casos, que es diferente. Puede verlo ejecutando el siguiente código y el código anterior.
# Both objects have different ids thats why the s1==s2 is false
print(id(s1))
print(id(s2))
Producción :
1991016021344 //(it will vary)
1991021345808 //(it will vary)
Pero si tuviéramos que crear una instancia y luego guardar esa instancia en otro ejemplo como el siguiente, sus direcciones serían las mismas. Echar un vistazo.
# object one of class student
s1 = Student("Ahsan", 293)
s3 = s1
# In this case we have same id for s1 and s3
print(s1 == s3)
print(id(s1))
print(id(s3))
Producción :
True
1913894976432 //(it will vary)
1913894976432 //(it will vary)
Le daría true como salida. Entonces, ¿cómo podemos comparar las dos instancias según los datos? Necesitamos implementar el método dunder y anularlo de la siguiente manera.
# class of student has constructor with two arguments and a modified dunder method of __eq__
class Student:
def __init__(self, name, roll):
self.name = name
self.roll = roll
# implementing the dunder method
def __eq__(self, obj):
# checking both objects of same class
if isinstance(obj, Student):
if self.roll == obj.roll:
return True
else:
return False
# object of class student
s4 = Student("David", 293)
# other object of class student
s5 = Student("David", 293)
# Applying equality function two objects
print(s4 == s5)
# Both objects have different ids, but the s4==s5 is true because we override the __eq__ function it will give true when the roll number is some
print(id(s4))
print(id(s5))
# object of class student
s6 = Student("David", 293)
# other object of class student
s7 = Student("David", 178)
# Applying equality function two objects will give us False because the roll is different
print(s6 == s7)
Producción :
True
1935568125136 //(it will vary)
1935568124656 //(it will vary)
False
Ahora, estamos anulando el método __eq__() poniendo una condición if dentro que verifica si el roll es el mismo o no. Así es como anula un método __eq__() en Python.