Objectifs de cette leçon
- Utiliser le polymorphisme pour appeler la même méthode différemment
- Comprendre la surcharge de méthodes
- Appliquer le principe de substitution de Liskov
Polymorphisme : un seul nom, mille visages 🎭
Polymorphisme = "poly" (plusieurs) + "morphisme" (formes). Un même mot, plusieurs significations selon le contexte.
1. Le polymorphisme dans la vie 🎯
pseudo CLASSE Forme FONCTION aire() RETOURNER 0 ⬅ Par défaut, une forme n'a pas d'aire FIN FONCTION FIN CLASSE
CLASSE Rectangle HÉRITE DE Forme largeur : réel hauteur : réel
CONSTRUCTEUR(largeur, hauteur) self.largeur ← largeur self.hauteur ← hauteur FIN CONSTRUCTEUR ' MÊME méthode, mais CHAQUE forme calcule différemment FONCTION aire() RETOURNER self.largeur × self.hauteur ⬅ largeur × hauteur FIN FONCTION
FIN CLASSE
CLASSE Cercle HÉRITE DE Forme rayon : réel
CONSTRUCTEUR(rayon) self.rayon ← rayon FIN CONSTRUCTEUR FONCTION aire() RETOURNER π × self.rayon × self.rayon ⬅ π × r² FIN FONCTION
FIN CLASSE
```python class Forme: def aire(self): return 0 class Rectangle(Forme): def __init__(self, largeur, hauteur): self.largeur = largeur self.hauteur = hauteur def aire(self): return self.largeur * self.hauteur class Cercle(Forme): def __init__(self, rayon): self.rayon = rayon def aire(self): return 3.14 * self.rayon ** 2 class Triangle(Forme): def __init__(self, base, hauteur): self.base = base self.hauteur = hauteur def aire(self): return 0.5 * self.base * self.hauteur
3. La magie : un seul appel, mille résultats ✨
Exécution pas à pas
pseudo1/27▶️' On crée un mélange de formes' On crée un mélange de formesLe programme exécute cette action, puis passe à la suivante.Le programme exécute cette instruction, puis passe à la suivante.
💡 Sans polymorphisme, on devrait écrire :
Exécution pas à pas
pseudo1/4❓SI forme EST Rectangle ALORS calculer_rectangle(forme)❓ DécisionOn vérifie si "forme EST Rectangle calculer_rectangle(forme)" est vraie. Le programme choisit entre deux chemins.Question : "forme EST Rectangle calculer_rectangle(forme)" est-elle vraie ? Le programme choisit entre deux chemins.
Avec polymorphisme, on écrit juste
forme.aire()et chaque objet se débrouille !
4. Le polymorphisme c'est aussi "duck typing" 🦆
"Si ça marche comme un canard et que ça cancane comme un canard, alors c'est un canard !"
En Python, on ne se demande pas "est-ce que c'est un Canard ?". On se demande juste "est-ce que ça a une méthode
cancaner()?"
class Canard: def nager(self): return "Le canard nage" def cancaner(self): return "Coin coin !" class Cygne: def nager(self): return "Le cygne glisse" def cancaner(self): return "Sssiii..." class Oie: def nager(self): return "L'oie barbote" def cancaner(self): return "Ouink !" def faire_nager(oiseau): print(oiseau.nager()) print(oiseau.cancaner()) # Peu importe la classe, du moment qu'elle a nager() et cancaner() ! faire_nager(Canard()) # ✅ faire_nager(Cygne()) # ✅ faire_nager(Oie()) # ✅
Schéma récapitulatif 📊
💡 Quand utiliser le polymorphisme ? Quand tu as plusieurs objets qui font la MÊME chose mais de façon DIFFÉRENTE ! Exemples : animaux qui parlent, formes qui calculent leur aire, véhicules qui démarrent, fichiers qui s'exportent...
Exécution pas à pas
État de la mémoire
8 variables⚡ Simulateur — Polymorphisme
Étape 1/7- Même appel de méthode → comportement différent
- Python cherche la méthode dans le type réel
- Si absente, il remonte la hiérarchie
- Code plus flexible et extensible
Classe de base Forme. aire() retourne 0 par défaut.