L’héritage est une pierre angulaire de la programmation orientée objet (POO), permettant la création de nouvelles classes (classes filles ou sous-classes) à partir de classes existantes (classes parentes ou superclasses). Cela favorise la réutilisabilité du code, réduit la redondance et encourage une base de code bien structurée. Ce tutoriel explore les mécanismes d’héritage de Python, en examinant différents types et en démontrant des applications pratiques.
Table des matières
- Surcharge de méthode
- Héritage multiple
- Héritage multi-niveau
- Exemple pratique : une hiérarchie de formes
Surcharge de méthode
La surcharge de méthode permet à une sous-classe de fournir une implémentation spécialisée pour une méthode héritée de sa superclasse. Cela personnalise le comportement hérité sans modifier la superclasse.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("Son d'animal générique")
class Dog(Animal):
def speak(self):
print("Woof !")
class Cat(Animal):
def speak(self):
print("Miaou !")
animal = Animal("Animal générique")
animal.speak() # Sortie : Son d'animal générique
dog = Dog("Buddy")
dog.speak() # Sortie : Woof !
cat = Cat("Whiskers")
cat.speak() # Sortie : Miaou !
La fonction super()
permet d’accéder à la méthode de la superclasse, permettant d’utiliser à la fois les comportements de la superclasse et de la sous-classe.
class Dog(Animal):
def speak(self):
super().speak()
print("Woof ! (de la classe Dog)")
Héritage multiple
Python prend en charge l’héritage multiple, où une classe hérite de plusieurs classes parentes, combinant ainsi les fonctionnalités. Cependant, la gestion des conflits de noms de méthode (le « problème du diamant ») nécessite une attention particulière. L’ordre de résolution des méthodes (ORM) de Python utilisant la linéarisation C3 assure une résolution des conflits prévisible. Vous pouvez inspecter l’ORM à l’aide de ClassName.__mro__
.
class Flyer:
def move(self):
print("Vol !")
class Swimmer:
def move(self):
print("Nage !")
class FlyingFish(Flyer, Swimmer):
pass
flying_fish = FlyingFish()
print(FlyingFish.__mro__) # Vérification de l'ORM
flying_fish.move() # Sortie : Vol ! (la méthode move de Flyer est appelée en premier en raison de l'ORM)
Héritage multi-niveau
L’héritage multi-niveau crée une hiérarchie où une sous-classe hérite d’une autre sous-classe, qui elle-même hérite d’une superclasse. Cela s’appuie sur les classes existantes avec une spécialisation croissante.
class Animal:
def __init__(self, name):
self.name = name
class Mammal(Animal):
def __init__(self, name, fur_color):
super().__init__(name)
self.fur_color = fur_color
class Dog(Mammal):
def __init__(self, name, fur_color, breed):
super().__init__(name, fur_color)
self.breed = breed
dog = Dog("Buddy", "Brown", "Golden Retriever")
print(f"{dog.name} est un {dog.breed} avec une fourrure {dog.fur_color}.")
# Sortie : Buddy est un Golden Retriever avec une fourrure Brown.
Exemple pratique : une hiérarchie de formes
Illustrons l’héritage avec un exemple pratique : une hiérarchie de formes. Nous commencerons par une classe de base Shape
et dériverons les classes Circle
et Rectangle
.
import math
class Shape:
def __init__(self, name):
self.name = name
def area(self):
raise NotImplementedError("La méthode area doit être implémentée dans les sous-classes")
class Circle(Shape):
def __init__(self, name, radius):
super().__init__(name)
self.radius = radius
def area(self):
return math.pi * self.radius**2
class Rectangle(Shape):
def __init__(self, name, width, height):
super().__init__(name)
self.width = width
self.height = height
def area(self):
return self.width * self.height
circle = Circle("Circle", 5)
rectangle = Rectangle("Rectangle", 4, 6)
print(f"L'aire du {circle.name} est : {circle.area()}")
print(f"L'aire du {rectangle.name} est : {rectangle.area()}")
Cet exemple montre comment l’héritage facilite l’organisation et la réutilisabilité du code. La méthode area
est définie dans la classe de base, obligeant les sous-classes à implémenter leurs calculs d’aire spécifiques.
Ce tutoriel fournit une introduction complète à l’héritage de classe en Python. Une exploration plus approfondie des classes de base abstraites, des interfaces et des modèles de conception qui utilisent l’héritage améliorera considérablement votre maîtrise de la POO.