Surcharge des opérateurs
Définition :
Une classe peut implémenter certaines opérations que l'on invoque par une syntaxe spéciale (telles que les opérations arithmétiques ou la découpe en tranches) en définissant des méthodes aux noms particuliers. C'est l'approche utilisée par Python pour la surcharge d'opérateur, permettant à une classe de définir son propre comportement vis-à-vis des opérateurs du langage.
Exemple : Surcharge de l'opérateur +
La méthode __add__
permet de surcharger l'opérateur +. Dans l'exemple suivant, une classe Fraction est définie et l'opérateur __add__
est surchargé.
class Fraction:
def __init__(self, p, q):
self.numerateur = p
self.denominateur = q
def __add__(self, b):
return Fraction(self.numerateur * b.denominateur +
b.numerateur * self.denominateur,
self.denominateur * b.denominateur)
Complément : Surcharge d'opérateur pour d'autres types de données
Lors de l'ajout d'un entier à une fraction on a un message d'erreur.

Pour éviter cela, il faut prévoir la surcharge pour chaque type d'opération
class Fraction:
def __init__(self, p, q):
self.numerateur = p
self.denominateur = q
def __add__(self, b):
if isinstance(b,int):
b = Fraction(b, 1)
if isinstance(b,Fraction):
return Fraction(self.numerateur * b.denominateur +
b.numerateur * self.denominateur,
self.denominateur * b.denominateur)
raise(NotImplemented(type(b) + ' not implemented for add Fraction'))
Complément : Surcharge d'opérateur les opérande
Pour gérer l'ordre des opérandes, il faut surcharger la méthode __radd__ (r pour reverse ou renversé).
class Fraction:
def __init__(self, p, q):
self.numerateur = p
self.denominateur = q
def __add__(self, b):
if isinstance(b,int):
b = Fraction(b, 1)
if isinstance(b,Fraction):
return Fraction(self.numerateur * b.denominateur +
b.numerateur * self.denominateur,
self.denominateur * b.denominateur)
raise(NotImplemented(type(b) + ' not implemented for add Fraction'))
def __radd__(self, b):
if isinstance(b,int):
return Fraction(b, 1) + self
else:
raise(NotImplemented(type(self) + ' not implemented for add Fraction'))