Méthode __eq__ en Python

Haider Ali 8 avril 2022
Méthode __eq__ en Python

Ce guide va montrer comment on gère la méthode __eq__() en Python. Nous allons composer différents objets et apprendre la fonctionnalité de cette méthode particulière. Plongeons-y directement.

__eq__() en Python

Tout d’abord, __eq__() est une méthode dunder/magique, comme vous pouvez le voir, elle est précédée et suivie de doubles traits de soulignement. Chaque fois que vous utilisez l’opérateur ==, cette méthode est déjà appelée pour comparer deux instances de classe. Python utilisera l’opérateur is pour la comparaison si vous ne fournissez pas d’implémentation spécifique pour la méthode __eq__(). Mais comment spécifiez-vous cette méthode? La réponse à cela réside dans le remplacement de cette fonction. Jetez un oeil au code suivant.

# __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)

Production :

False

Comme vous pouvez le voir, nous avons créé une classe nommée Student et avons défini deux de ses arguments comme name et roll. Plus tard, vous avez créé deux instances contenant les mêmes données de classe Student. La comparaison de ces deux instances comme nous l’avons fait dans le code ci-dessus donnera un résultat false.

Bien que ces instances aient les mêmes données, elles ne sont pas égales une fois comparées. C’est parce que l’opérateur == compare l’adresse des cas, qui est différente. Vous pouvez le voir en exécutant le code suivant et le code ci-dessus.

# Both objects have different ids thats why the s1==s2 is false
print(id(s1))
print(id(s2))

Production :

1991016021344   //(it will vary)
1991021345808   //(it will vary)

Mais si nous devions créer une instance et enregistrer plus tard cette instance dans un autre exemple comme celui-ci, leurs adresses seraient les mêmes. Regarde.

# 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))

Production :

True
1913894976432  //(it will vary)
1913894976432  //(it will vary)

Cela vous donnerait true en sortie. Alors, comment pouvons-nous comparer les deux instances sur la base des données ? Nous devons implémenter la méthode dunder et la remplacer comme suit.

# 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)

Production :

True
1935568125136   //(it will vary)
1935568124656   //(it will vary)
False

Maintenant, nous redéfinissons la méthode __eq__() en mettant une condition if à l’intérieur qui vérifie si le roll est le même ou non. C’est ainsi que vous surchargez une méthode __eq__() en Python.

Auteur: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn