Python >> Tutoriel Python >  >> Python

Méthode magique Python __eq__

Pour personnaliser le comportement de l'opérateur d'égalité x == y , remplacez le __eq__() méthode dunder dans votre définition de classe. Python appelle en interne x.__eq__(y) pour comparer deux objets en utilisant x == y . Si le __eq__() méthode n'est pas définie, Python utilisera le is opérateur par défaut qui vérifie pour deux objets arbitraires s'ils résident sur la même adresse mémoire.

Syntaxe

__eq__(self, other)

Pour utiliser le égal à opérateur sur les objets personnalisés, définissez le __eq__() "dunder" méthode magique qui prend deux arguments :self et other . Vous pouvez ensuite utiliser les attributs des objets personnalisés pour déterminer si l'un est égal à l'autre. Il doit renvoyer un booléen True ou False .

Regardons un exemple ensuite.

Exemple

Dans le code suivant, vous vérifiez si une personne est égale à une autre personne en utilisant le age attribut comme critère de décision :

class Person:
    def __init__(self, age):
        self.age = age

    def __eq__(self, other):
        return self.age == other.age



alice = Person(18)
bob = Person(19)
carl = Person(18)

print(alice == bob)
# False

print(alice == carl)
# True

Parce qu'Alice a 18 ans et que Bob a 19 ans, le résultat de alice == bob est False . Mais le résultat de alice == carl évalue à True car les deux ont le même âge.

Vidéo de fond

Implémentation par défaut de __eq__

Par défaut, le __eq__() la méthode dunder est implémentée en utilisant le is opérateur d'identité. Les opérateurs d'identité sont utilisés pour vérifier si deux valeurs ou variables résident au même emplacement mémoire, c'est-à-dire se réfèrent au même objet en mémoire.

Étant donné que l'opérateur d'identité de secours est défini pour chaque objet, vous pouvez également vérifier l'égalité pour deux objets.

L'exemple suivant montre que vous pouvez comparer des personnes personnalisées à l'aide de l'opérateur d'égalité == , même sans définir le __eq__ méthode. En interne, Python utilise l'opérateur d'identité :

class Person:
    def __init__(self, age):
        self.age = age



alice = Person(18)
bob = Person(19)
carl = Person(18)

print(alice == bob)
# False

print(alice == carl)
# False

Opérateur d'identité vidéo en arrière-plan

Pour comprendre l'opérateur d'identité, n'hésitez pas à regarder la vidéo de fond suivante :

Commutativité de l'égalité ==

La sortie de x == y et y == x peut être différent car le premier appelle x.__eq__(y) et ce dernier appelle y.__eq__(x) . Si x et y ont des définitions différentes de la méthode dunder __eq__() , l'opération devient non commutative .

Vous pouvez le voir dans l'exemple suivant :

class Person:
    def __eq__(self, other):
        return False


class Human:
    def __eq__(self, other):
        return True


alice = Person()
bob = Human()


print(alice == bob)
# False

print(bob == alice)
# True