Les méthodes magiques, souvent appelées dunder methods, sont des méthodes dont les noms sont réservés par Python. Ces méthodes représentent des protocles internes au langage.
En les implémentant dans vos classes, vous permettez à vos objets de s'interfacer avec des fonctionnalités de base comme les opérateurs, les boucles et les fonctions intégrées.
Les méthodes spéciales sont facilement identifiables, car elles sont entourées de doubles underscore. Exemple : __init__.
Qu'est-ce qu'une méthode magique ?
Généralement, les méthodes magiques ne sont pas directement appelées par leur nom. C'est l'interpréteur Python qui s'en charge lors d'opérations spécifiques. Par exemple, __str__ sera appelée si on utilise la fonction str() sur une instance ou avec print(), __add__ sera exécutée si l'opérateur + est utilisé, et __len__ sera invoquée lors de l'appel de la fonction len().
Vous pouvez définir un comportement similaire à celui des types natifs (list, dict, str...) qui embarquent leurs propres méthodes magiques.
class Score: def __init__(self, points): self.points = points def __add__(self, autre): # Cette méthode est appelée par l'opérateur '+' return Score(self.points + autre.points) def __str__(self): # Cette méthode est appelée par la fonction 'print()' return f"Le score est de : {self.points} points" score_a = Score(10) score_b = Score(20) # Python voit '+', il appelle en secret score_a.__add__(score_b) total = score_a + score_b # Python voit 'print', il appelle en secret total.__str__() print(total) # Affiche : Le score est de : 30 points
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.
L'automatisation avec les Dataclasses
Depuis Python 3.7, le module dataclasses permet d'automatiser la génération par défaut des méthodes magiques __init__, __repr__ et __eq__. Je vous invite d'ailleurs à lire notre glossaire sur le sujet.
Cette automatisation souligne l'importance de ces méthodes magiques dans la conception orientée objet en Python.
from dataclasses import dataclass @dataclass class Produit: nom: str prix: float # Sans rien écrire d'autre, Python a déjà créé : # 1. __init__ pour accepter 'nom' et 'prix' # 2. __repr__ pour un affichage propre # 3. __eq__ pour comparer deux produits iphone1 = Produit("iPhone", 999.0) iphone2 = Produit("iPhone", 999.0) # Ici, print() cherche __str__ mais se rabat sur le __repr__ # généré par la dataclass car __str__ n'est pas définie par défaut. print(iphone1) # Affiche : Produit(nom='iPhone', prix=999.0) # Comparaison entre deux instances (utilise le __eq__ généré automatiquement) print(iphone1 == iphone2) # Affiche : True car les données sont identiques
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.