🐍 PyTutos

Méthodes spéciales (dunder) : __str__, __eq__, __len__…

Personnalise le comportement de tes objets avec les méthodes magiques.

⏱ 12 minutes 📂 avance #avance #classes #dunder #magic-methods

Les méthodes spéciales (dunder)

Les méthodes nommées __truc__ (double underscore) sont les méthodes magiques : Python les appelle automatiquement dans certaines situations.

__init__ — constructeur (déjà vu)

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

__str__ — affichage pour humain

Appelée par print() et str() :

class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __str__(self):
        return f"Point({self.x}, {self.y})"

p = Point(3, 4)
print(p)        # Point(3, 4)

Sans __str__, on obtient un truc moche comme <__main__.Point object at 0x...>.

__repr__ — affichage technique

Utile pour le débogage. Si tu n'écris que __str__, alors repr(p) reste laid. Bonne pratique : toujours écrire __repr__.

def __repr__(self):
    return f"Point(x={self.x}, y={self.y})"

__eq__ — opérateur ==

class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, autre):
        return self.x == autre.x and self.y == autre.y

print(Point(1, 2) == Point(1, 2))   # True
print(Point(1, 2) == Point(3, 4))   # False

__len__ — la fonction len()

class Equipe:
    def __init__(self, membres):
        self.membres = membres

    def __len__(self):
        return len(self.membres)

e = Equipe(["Zazac", "Lea", "Tom"])
print(len(e))   # 3

__add__ — opérateur +

class Vecteur:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __add__(self, autre):
        return Vecteur(self.x + autre.x, self.y + autre.y)

    def __repr__(self):
        return f"Vecteur({self.x}, {self.y})"

v = Vecteur(1, 2) + Vecteur(3, 4)
print(v)   # Vecteur(4, 6)

Autres dunder utiles

Méthode Sert à…
__lt__, __gt__ <, > (comparaisons)
__getitem__(i) obj[i]
__setitem__(i, v) obj[i] = v
__contains__(x) x in obj
__iter__ rendre l'objet itérable
__call__ rendre l'objet appelable comme fonction
class Pluriel:
    def __call__(self, mot):
        return mot + "s"

plus = Pluriel()
print(plus("chat"))   # chats  ← appelé comme une fonction !

💡 Les dunder sont la vraie magie de Python. C'est ce qui fait que tes objets s'intègrent naturellement avec print, len, +, for, etc.

🧪 Quiz de validation

Réponds à toutes les questions. Il faut 70% de bonnes réponses pour valider le tuto !

🔒 Tu dois être connecté pour passer le quiz.