Intermédiaire50 min35 XP
Objectifs de cette leçon
- Combiner des classes par composition plutôt qu'héritage
- Créer des objets complexes à partir d'objets simples
- Choisir entre héritage et composition
Composition : assembler des briques 🧩
La composition, c'est le principe : "un objet est composé d'autres objets". Comme une voiture est composée d'un moteur, de roues, d'un volant...
1. La composition dans la vie 🚗
🚗 Une voiture, c'est un assemblage d'autres objets : un moteur, 4 roues, un volant, des sièges, un GPS...
Chaque pièce a sa propre classe. La voiture les compose !
2. Composition vs Héritage ⚔️
Héritage : "EST-UN" 🧬
class Animal: def respirer(self): print("Respire...") class Chien(Animal): # Chien EST-UN Animal ✅ pass
Composition : "A-UN" 🧩
class Moteur: def demarrer(self): return "Vroom !" class Roue: def tourner(self): return "Tourne..." class Voiture: # Voiture A-UN Moteur, A-UNES Roues ✅ def __init__(self): self.moteur = Moteur() # Voiture contient un Moteur self.roues = [Roue() for _ in range(4)] # Voiture contient 4 Roues def demarrer(self): return self.moteur.demarrer() voiture = Voiture() print(voiture.demarrer()) # Vroom ! ``' ```pseudo CLASSE Moteur FONCTION démarrer() RETOURNER "Vroom !" FIN FONCTION FIN CLASSE CLASSE Roue FONCTION tourner() RETOURNER "Tourne..." FIN FONCTION FIN CLASSE CLASSE Voiture moteur : Moteur roues : liste de Roue CONSTRUCTEUR() self.moteur ← Moteur() ⬅ Composé d'un moteur self.roues ← [Roue(), Roue(), Roue(), Roue()] ⬅ Composé de 4 roues FIN CONSTRUCTEUR FONCTION démarrer() RETOURNER self.moteur.démarrer() FIN FONCTION FIN CLASSE ``' --- ## 3. Exemple concret : Système d'école 🏫 ```pseudo CLASSE Élève nom : texte niveau : entier CONSTRUCTEUR(nom, niveau) self.nom ← nom self.niveau ← niveau FIN CONSTRUCTEUR FIN CLASSE CLASSE Professeur nom : texte matière : texte CONSTRUCTEUR(nom, matière) self.nom ← nom self.matière ← matière FIN CONSTRUCTEUR FONCTION enseigner() RETOURNER self.nom + " enseigne " + self.matière FIN FONCTION FIN CLASSE CLASSE École nom : texte élèves : liste professeurs : liste CONSTRUCTEUR(nom) self.nom ← nom self.élèves ← [] ⬅ Composée d'élèves self.professeurs ← [] ⬅ Composée de professeurs FIN CONSTRUCTEUR FONCTION ajouter_élève(élève) self.élèves.ajouter(élève) FIN FONCTION FONCTION ajouter_professeur(prof) self.professeurs.ajouter(prof) FIN FONCTION FONCTION décrire() afficher("🏫 " + self.nom) afficher("👨🎓 " + taille(self.élèves) + " élèves") afficher("👩🏫 " + taille(self.professeurs) + " professeurs") FIN FONCTION FIN CLASSE
class Eleve: def __init__(self, nom, niveau): self.nom = nom self.niveau = niveau class Professeur: def __init__(self, nom, matiere): self.nom = nom self.matiere = matiere def enseigner(self): return f"{self.nom} enseigne {self.matiere}" class Ecole: def __init__(self, nom): self.nom = nom self.eleves = [] self.professeurs = [] def ajouter_eleve(self, eleve): self.eleves.append(eleve) def ajouter_professeur(self, prof): self.professeurs.append(prof) def decrire(self): print(f"🏫 {self.nom}") print(f"👨🎓 {len(self.eleves)} élèves") print(f"👩🏫 {len(self.professeurs)} professeurs") # Utilisation ecole = Ecole("Collège Jean Moulin") ecole.ajouter_eleve(Eleve("Sophie", 5)) ecole.ajouter_eleve(Eleve("Lucas", 4)) ecole.ajouter_eleve(Eleve("Emma", 3)) ecole.ajouter_professeur(Professeur("Mme Martin", "Mathématiques")) ecole.ajouter_professeur(Professeur("M. Dubois", "Français")) ecole.decrire() # 🏫 Collège Jean Moulin # 👨🎓 3 élèves # 👩🏫 2 professeurs
4. Composition en chaîne : les Lego 🧱
💡 Chaque objet est composé d'objets plus petits, qui sont eux-mêmes composés d'objets encore plus petits... C'est une hiérarchie de composition !
Schéma récapitulatif 📊
💡 Règle d'or : "Préfère la composition à l'héritage".
- Si c'est "EST-UN" → héritage (Chien EST-UN Animal)
- Si c'est "A-UN" → composition (Voiture A-UN Moteur)
Exécution pas à pas
0/6
État de la mémoire
3 variablesVariable
Valeur
Type
Addr.
école.nom
Jean Moulin
str
0x1A00
école.élèves
[Sophie, Lucas]
list
0x1A08
école.professeurs
[Mme Martin]
list
0x1A10
école.nom0x1A00
Jean Moulin
str
école.élèves0x1A08
[Sophie, Lucas]
list
école.professeurs0x1A10
[Mme Martin]
list
⚡ Simulateur — Composition
Étape 1/8📝 Pseudo-code
1CLASSE Moteur # ← composant 1
2 FONCTION démarrer()
3 RETOURNER 'Vroom !'
4 FIN FONCTION
5FIN CLASSE
6
7CLASSE Roue # ← composant 2
8 FONCTION tourner()
9 RETOURNER 'Tourne...'
10 FIN FONCTION
11FIN CLASSE
12
13CLASSE Voiture # ← composé de ...
14 moteur : Moteur # ⬅ A-UN Moteur
15 roues : liste de Roue # ⬅ A-UNES Roues
16 CONSTRUCTEUR()
17 self.moteur ← Moteur()
18 self.roues ← [Roue(), Roue(), Roue(), Roue()]
19 FIN CONSTRUCTEUR
20 FONCTION démarrer() # ⬅ délègue à Moteur
21 RETOURNER self.moteur.démarrer()
22 FIN FONCTION
23FIN CLASSE
24
25moteur ← Moteur() # ⬅ créer composant
26voiture ← Voiture() # ⬅ créer l'assemblage
27afficher(voiture.démarrer()) # ⬅ voir la délégation
🧩 Composition
💡 Composition vs Héritage
🧬 Héritage
Chien EST-UN Animal
Est une relation de parenté
🧩 Composition
Voiture A-UN Moteur
Est une relation de contenant
💡 Règle d'or : Préfère la composition à l'héritage
Classe Moteur : un moteur peut démarrer.