Héritage
L'héritage est un concept fondamental en programmation orientée objet. Il permet de définir une classe en se basant sur une autre classe déjà existante. La classe existante est appelée la classe mère ou la classe de base, et la nouvelle classe est appelée la classe fille ou la classe dérivée. Cela permet de réutiliser le code déjà existant et de créer des classes plus spécialisées.
Par exemple, la classe Point définie précédemment peut être utilisée comme
classe de base pour définir une classe PointCouleur qui ajoute un attribut
couleur à un point. On pourrait aussi définir une classe PointTitre qui
ajoute un attribut titre à un point. Ces deux classes héritent des attributs
et des méthodes de la classe Point.
Le code Python correspondant serait le suivant :
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def distance(self, other):
return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
class PointCouleur(Point):
def __init__(self, x, y, couleur):
super().__init__(x, y)
self.couleur = couleur
class PointTitre(Point):
def __init__(self, x, y, titre):
super().__init__(x, y)
self.titre = titre
Dans cet exemple, la classe PointCouleur hérite de la classe Point en
spécifiant Point entre parenthèses après le nom de la classe. Cela signifie
que PointCouleur hérite de tous les attributs et méthodes de la classe Point.
La méthode __init__ de la classe PointCouleur appelle la méthode __init__
de la classe Point en utilisant la fonction super(). Cela permet d'initialiser
les attributs de la classe Point avant d'ajouter l'attribut couleur.
Ainsi, l'héritage permet de créer une hiérarchie de classes où les classes filles héritent des attributs et des méthodes des classes mères.
La méthode super()
La fonction super() est utilisée pour appeler un attribut ou une méthode de
la classe mère depuis une classe fille. Elle est souvent utilisée dans les
méthodes __init__ pour initialiser les attributs de la classe mère avant
d'ajouter des attributs spécifiques à la classe fille comme dans l'exemple
précédent.
Il serait également possible d'appeler directement la méthode de la classe mère comme suit :
class PointCouleur(Point):
def __init__(self, x, y, couleur):
Point.__init__(self, x, y)
self.couleur = couleur
Toutefois, l'utilisation de super() est recommandée car elle permet de gérer
automatiquement la hiérarchie des classes. De plus, la méthode super() est
particulièrement utile également pour étendre une méthode de la classe mère
dans une classe fille plutôt que de la remplacer complètement. Nous verrons
ceci à la section polymorphisme.
ceci à la section polymorphisme.