0 XP
?
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 variables
Variable
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
⚙️ Moteur
💡 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.