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.
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.
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.
La classe mère Vehicule regroupe ce qui est commun : immatriculation, marque, prix par jour, et les méthodes louer() et decrire().
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.
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
| Type | Schéma | Exemple |
|---|---|---|
| simple | A → B | Vehicule → Voiture |
| hiérarchique | A → B, A → C | Vehicule → Voiture et Moto |
| à plusieurs niveaux | A → B → C | Vehicule → Voiture → Taxi |
| multiple | A + B → C | Voiture + 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.
marque) : accessible partout ;_disponible) : utilisé dans les classes filles, c’est son rôle ;__x) : réservé à la classe mère, la fille ne le voit pas directement.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.
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.
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
Exécutez le code : les objets et leurs attributs s'afficheront ici.
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.
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")
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.
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.
Écrivez une classe VoitureElectrique qui hérite de Voiture et d'une classe Rechargeable (méthode recharger()). Affichez VoitureElectrique.__mro__.
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__])