permet à une classe (la ou ) de réutiliser et d'étendre les champs et méthodes d'une autre classe (la ou ). Il modélise une relation : un .
DogAnimalclass Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog inherits everything from Animal
def bark(self): # ...and adds new behavior
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → inherited, not rewritten
print(d.bark()) # "Woof!" → Dog-specific
Dog a obtenu __init__ et eat gratuitement et a ajouté bark. Une sous-classe peut aussi surcharger les méthodes héritées pour changer le comportement.
| Avantage | Risque |
|---|---|
| Réutiliser du code partagé | Couplage étroit au parent |
| Modéliser des hiérarchies réelles | Classe de base fragile — les modifications du parent cassent les enfants |
| Polymorphisme via un type commun | Les arbres profonds deviennent difficiles à suivre |
Une ligne directrice courante : favoriser la composition plutôt que l'héritage quand la relation est vraiment « a-un », pas « est-un ».
L'héritage est la fonctionnalité OOP la plus mal utilisée : il est tentant de l'utiliser juste pour partager du code, ce qui couple des classes sans rapport.
Utilisé correctement — uniquement pour les relations est-un authentiques — il vous donne la réutilisation plus le polymorphisme, vous permettant de traiter de nombreux sous-types uniformément à travers leur parent commun.