Maîtriser l'héritage Python : concepts, syntaxe et exemples pratiques
Héritage Python
L'héritage vous permet de créer une nouvelle classe qui hérite de toute la fonctionnalité d'une classe parente tout en ajoutant ou étendant des fonctionnalités. Ce tutoriel explique comment utiliser l'héritage en Python, avec des exemples clairs et des conseils de bonnes pratiques.
Vidéo : Héritage Python
Héritage en Python
L'héritage est un principe fondamental de la programmation orientée objet qui favorise la réutilisation de code et la hiérarchie logique. Une nouvelle classe (la classe dérivée ou classe fille) est définie avec des modifications minimales ou nulles à une classe existante (la classe de base ou classe parente). La classe fille reçoit automatiquement les attributs et méthodes de son parent, qui peuvent ensuite être redéfinis ou étendus selon les besoins.
Syntaxe de l'héritage Python
class ClasseDeBase:
# corps de la classe de base
class ClasseDerivee(ClasseDeBase):
# corps de la classe dérivée
Dans l'extrait ci-dessus, ClasseDerivee hérite de tous les membres publics de ClasseDeBase. En ajoutant de nouvelles méthodes ou en redéfinissant celles existantes, la classe dérivée peut personnaliser le comportement tout en réutilisant l'implémentation de base.
Exemple d'héritage en Python
Illustrons l'héritage avec un exemple pratique. Supposons que nous ayons une classe générique Polygone qui stocke le nombre de côtés et leurs longueurs :
class Polygone:
def __init__(self, nb_cotes):
self.n = nb_cotes
self.cotes = [0 for _ in range(nb_cotes)]
def saisir_cotes(self):
self.cotes = [float(input(f"Entrez le côté {i+1} : ")) for i in range(self.n)]
def afficher_cotes(self):
for i, cote in enumerate(self.cotes, 1):
print(f"Côté {i} est {cote}")
La classe Polygone encapsule les attributs et méthodes communs à tout polygone. Un Triangle est un polygone spécifique avec exactement trois côtés, il peut donc hériter de Polygone sans redéfinir la logique partagée :
class Triangle(Polygone):
def __init__(self):
super().__init__(3) # initialiser la base avec 3 côtés
def calculer_aire(self):
a, b, c = self.cotes
s = (a + b + c) / 2
aire = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print(f"L'aire du triangle est {aire:.2f}")
L'exécution du code suivant démontre l'héritage en action :
>>> t = Triangle()
>>> t.saisir_cotes()
Entrez le côté 1 : 3
Entrez le côté 2 : 5
Entrez le côté 3 : 4
>>> t.afficher_cotes()
Côté 1 est 3.0
Côté 2 est 5.0
Côté 3 est 4.0
>>> t.calculer_aire()
L'aire du triangle est 6.00
Remarquez que Triangle peut appeler saisir_cotes() et afficher_cotes() même s'il ne les définit jamais — l'héritage rend ces méthodes disponibles automatiquement.
Si un attribut ou méthode n'est pas trouvé dans la classe fille, Python recherche dans la classe parente, et cette recherche continue dans la chaîne d'héritage si nécessaire.
Redéfinition de méthode en Python
À la fois Polygone et Triangle définissent une méthode __init__. L'implémentation de la fille redéfinit celle du parent, mais elle peut (et devrait) étendre la logique de base en l'invoquant explicitement. L'utilisation de super() est l'approche moderne et préférée :
class Triangle(Polygone):
def __init__(self):
super().__init__(3) # appelle Polygone.__init__
Lors de la redéfinition, la méthode fille peut ajouter un nouveau comportement ou modifier le comportement de base tout en préservant la fonctionnalité originale.
Python fournit isinstance() et issubclass() pour introspecter les relations d'héritage :
t = Triangle()
print(isinstance(t, Triangle)) # True
print(isinstance(t, Polygone)) # True
print(isinstance(t, int)) # False
print(isinstance(t, object)) # True
print(issubclass(Polygone, Triangle)) # False
print(issubclass(Triangle, Polygone)) # True
print(issubclass(bool, int)) # True
Ces utilitaires sont essentiels pour la vérification de types et s'assurer que les objets conforment aux interfaces attendues.
Pour plus sur super(), voir la documentation de la fonction super() Python.
Python
- Maîtriser les types de données Python : Guide pratique
- Maîtriser les opérateurs Python : Guide complet
- Maîtriser l'instruction pass en Python : Guide pratique
- Maîtriser les dictionnaires Python : création, manipulation et techniques avancées
- Maîtriser les exceptions personnalisées Python : guide pratique
- Maîtriser la programmation orientée objet Python : classes, héritage, encapsulation et polymorphisme
- Maîtriser la surcharge d'opérateurs en Python : guide pratique
- Maîtriser le décorateur @property de Python : getters et setters propres et compatibles
- Comprendre type() et isinstance() en Python : exemples pratiques