Aller au contenu
M03 · B. Connaître les principaux piliers de la POO

L'héritage : réutiliser une classe existante

Créer une classe fille qui hérite des attributs et des méthodes d'une classe mère, appeler le constructeur parent avec super(), et connaître les types d'héritage.

1Situer

Une agence de location à Marrakech loue des voitures et des motos. Les deux ont une immatriculation, une marque et un prix par jour, et se louent de la même façon. Mais une voiture a un nombre de places, une moto une cylindrée. Plutôt que d'écrire deux classes presque identiques, on écrit une classe Vehicule et deux classes filles qui en héritent.

2Comprendre

L'héritage : les filles reçoivent ce qu'a la mère
Vehicule immat, marque, prix_jour louer() decrire() hérite de Voiture+ places Moto+ cylindree (reçus : immat, marque, louer()...) (reçus : immat, marque, louer()...) super().__init__ v.decrire()trouvée ✓

La classe mère Vehicule regroupe ce qui est commun : immatriculation, marque, prix par jour, et les méthodes louer() et decrire().

1 / 5

L’héritage permet de créer une classe à partir d’une autre. La classe de départ s’appelle classe mère (ou parente, ou super-classe) ; la nouvelle, classe fille (ou dérivée, ou sous-classe).

class Voiture(Vehicule):
    ...

La classe fille reçoit tous les attributs et toutes les méthodes de la mère. Elle peut en ajouter et en redéfinir.

Le chaînage des constructeurs

Si la fille a son propre __init__, elle doit appeler celui de la mère pour que les attributs hérités soient initialisés :

def __init__(self, immat, marque, prix_jour, places):
    super().__init__(immat, marque, prix_jour)
    self.places = places

Les types d’héritage

TypeSchémaExemple
simpleA → BVehicule → Voiture
hiérarchiqueA → B, A → CVehicule → Voiture et Moto
à plusieurs niveauxA → B → CVehicule → Voiture → Taxi
multipleA + B → CVoiture + Rechargeable → VoitureElectrique

Python accepte l’héritage multiple. L’ordre de recherche des méthodes s’appelle le MRO (Method Resolution Order) : Classe.__mro__ l’affiche.

Visibilité dans la classe fille

  • public (marque) : accessible partout ;
  • protégé (_disponible) : utilisé dans les classes filles, c’est son rôle ;
  • privé (__x) : réservé à la classe mère, la fille ne le voit pas directement.

Le test « est un »

On n’utilise l’héritage que si la phrase « une fille est un mère » est vraie. Sinon, on utilise un attribut (« a un ») : c’est la composition.

Exemple simple

L'arbre généalogique

Un enfant hérite des yeux de sa mère et peut avoir en plus ses propres talents. Une classe fille reçoit tout ce que contient la classe mère et ajoute ce qui lui est propre.

Exemple simple

Le formateur est une personne

On teste l'héritage avec la phrase « est un » : un formateur est une personne, un stagiaire est une personne. Si la phrase sonne faux (« un moteur est une voiture »), ce n'est pas de l'héritage.

class Personne:
    def __init__(self, nom):
        self.nom = nom

class Formateur(Personne):      # Formateur hérite de Personne
    def __init__(self, nom, matiere):
        super().__init__(nom)
        self.matiere = matiere

3Manipuler

Exécutez : dans la mémoire, la voiture et la moto héritent de Vehicule et ont reçu ses attributs. Créez une classe Camion(Vehicule) avec un attribut charge_max.
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 · La classe Camion

Ajoutez une classe Camion qui hérite de Vehicule et ajoute un attribut charge_max (en tonnes). Créez un camion et affichez sa description.

Voir le corrigé
class Camion(Vehicule):
    def __init__(self, immat, marque, prix_jour, charge_max):
        super().__init__(immat, marque, prix_jour)
        self.charge_max = charge_max

c = Camion("999-C-40", "Isuzu", 600, 3.5)
print(c.decrire(), c.charge_max, "t")

Exercice 2 · « Est un » ou « a un » ?

Pour chaque couple, dites s'il faut un héritage ou un simple attribut : (1) Etudiant / Personne ; (2) Voiture / Moteur ; (3) CompteEpargne / Compte ; (4) Ecole / Classe.

Voir le corrigé
1. Héritage : un étudiant est une personne.
2. Attribut : une voiture a un moteur (composition).
3. Héritage : un compte épargne est un compte.
4. Attribut : une école a des classes.

Exercice 3 · Héritage multiple

Écrivez une classe VoitureElectrique qui hérite de Voiture et d'une classe Rechargeable (méthode recharger()). Affichez VoitureElectrique.__mro__.

Voir le corrigé
class Rechargeable:
    def recharger(self):
        print("Recharge en cours...")

class VoitureElectrique(Voiture, Rechargeable):
    pass

ve = VoitureElectrique("1-E-40", "Renault Zoe", 300, 4)
ve.recharger()
print([c.__name__ for c in VoitureElectrique.__mro__])

5Vérifier

1. À quoi sert super().__init__(...) dans le constructeur d'une classe fille ?
2. Comment écrit-on que Moto hérite de Vehicule ?
3. Un attribut privé __x de la classe mère est-il accessible directement dans la classe fille ?