Aller au contenu
M03 · C. Coder des solutions orientées objet

Coder une solution orientée objet complète

Organiser un projet en package, coder ses classes et réunir encapsulation, héritage, polymorphisme, abstraction et interfaces dans une même application.

1Situer

Le directeur d'un centre de formation à Kénitra demande une petite application : gérer les stagiaires et les formateurs, les regrouper par groupe, calculer la moyenne d'un groupe et afficher la fiche de chaque personne. C'est le moment d'assembler tout ce que vous avez appris : chaque concept de la POO trouve sa place dans ce mini-projet.

2Comprendre

Organiser un projet en package
projet.py800 lignes 📁 centre/ __init__.py personnes.pyPersonne, Stagiaire, Formateur groupes.pyGroupe main.py from centre.groupesimport Groupe

Tout le projet tient dans un seul fichier de 800 lignes : difficile à lire et à partager.

1 / 5

Coder une solution orientée objet, c’est d’abord concevoir, puis organiser, puis coder et tester.

1. Concevoir les classes

À partir de l’énoncé, on souligne les noms (stagiaire, formateur, groupe, note) : ce sont des candidats classes ou attributs. Les verbes (inscrire, calculer, afficher) deviennent des méthodes. On note les liens :

  • « est un » → héritage (un stagiaire est une personne) ;
  • « a un / contient » → composition (un groupe contient des stagiaires).

2. Organiser en package

Un package est un dossier qui regroupe des modules (fichiers .py), avec un fichier __init__.py :

centre/
├── __init__.py
├── personnes.py
└── groupes.py
main.py

Dans main.py : from centre.personnes import Stagiaire.

3. Intégrer les concepts

ConceptOù dans le projet
encapsulationnotes privées, ajout contrôlé par ajouter_note()
héritageStagiaire et Formateur héritent de Personne
polymorphismeprint(p) appelle la bonne fiche()
abstractionPersonne est abstraite, fiche() est obligatoire
interfaceon pourrait ajouter Imprimable pour les fiches PDF

4. Tester au fur et à mesure

Après chaque classe, créez deux ou trois objets et affichez-les. Un bug trouvé tout de suite se corrige en une minute.

Exemple simple

Ranger sa chambre

Les vêtements dans l'armoire, les livres sur l'étagère, les chaussures dans le placard. Un package, c'est pareil : un dossier pour le projet, un fichier par sujet. On retrouve tout plus vite.

centre/
├── __init__.py
├── personnes.py
└── groupes.py
main.py
Exemple simple

D'abord le schéma, ensuite le code

Avant de coder, on dessine les classes et leurs liens sur papier : qui hérite de qui, qui contient quoi. Cinq minutes de schéma économisent une heure de corrections.

Personne (abstraite)
├── Stagiaire   a des notes
└── Formateur   a une spécialité
Groupe          contient des Stagiaire

3Manipuler

Exécutez le mini-projet. Observez la mémoire : le groupe contient des stagiaires, qui héritent de Personne. Ajoutez un stagiaire avec ses notes et relancez.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

Exécutez le code : les objets et leurs attributs s'afficheront ici.

4Pratiquer

Exercice 1 · Le meilleur stagiaire

Ajoutez à Groupe une méthode meilleur() qui renvoie le stagiaire qui a la meilleure moyenne.

Voir le corrigé
def meilleur(self):
    return max(self.stagiaires, key=lambda s: s.moyenne)

Exercice 2 · Découper en package

Proposez la structure de fichiers d'un package centre qui contient ce projet, et écrivez la ligne d'import de main.py.

Voir le corrigé
centre/
├── __init__.py        (peut être vide)
├── personnes.py       Personne, Stagiaire, Formateur
└── groupes.py         Groupe (importe Stagiaire)
main.py

# main.py
from centre.personnes import Stagiaire, Formateur
from centre.groupes import Groupe

Exercice 3 · Une nouvelle sorte de personne

Ajoutez une classe Administratif(Personne) avec un attribut poste. Que devez-vous obligatoirement écrire dans cette classe, et pourquoi ?

Voir le corrigé
class Administratif(Personne):
    def __init__(self, nom, prenom, poste):
        super().__init__(nom, prenom)
        self.poste = poste

    def fiche(self):          # obligatoire : méthode abstraite
        return f"[Admin] {self.prenom} {self.nom}, {self.poste}"

5Vérifier

1. Qu'est-ce qui transforme un dossier en package Python importable ?
2. Dans le projet, la relation entre Groupe et Stagiaire est :
3. Pourquoi la liste des notes est-elle privée (__notes) ?