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