Héritage
Définition :
L'héritage est une relation entre deux classes. Elle indique qu'une classe dite classe fille (appelée aussi classe héritée ou dérivée) possède les attributs et les méthodes de la classe dite mère (appelée aussi classe de base). La classe fille peut posséder d'autres attributs ou méthodes qui lui sont propres : la classe fille hérite des propriétés et attributs de la classe mère.
Exemple : Un cercle, c'est une forme, un rectangle aussi
Créons une classe forme. Une forme a un nom et l'on peut calculer son périmètre et sa surface.
class Forme:
def __init__(self,nom):
self.nom = nom
self.__surface = -1
self.__perimetre = -1
def surface(self):
raise NotImplementedError('La classe fille doit implémenter surface')
def perimetre(self):
raise NotImplementedError('La classe fille doit implémenter perimetre')
def setSurface(self, s):
self.__surface = s
def getSurface(self):
return self.__surface
Les méthodes surface
et perimetre
sont systématiquement en erreur. La classe fille doit iplémenter ces méthodes (surchage de la méthode de la classe mère). L'attribut __surface est privé donc deux mutateurs sont créés, setSurface
et getSurface
.
La classe Cercle est construite en héritant de la classe Forme , class Cercle(Forme)
class Cercle(Forme):
def __init__(self, x, y, r=1):
super().__init__("cercle")
self.centre = (x, y)
self.__rayon = r
def setRayon(self, r):
self.__rayon = r
self.setSurface(-1)
return self.__rayon
def getRayon(self):
return self.__rayon
def surface(self):
if self.getSurface() < 0:
self.setSurface(np.pi * self.__rayon * self.__rayon)
return self.getSurface()
Dans le constructeur de la classe Cercle, on appelle le constructeur de la classe mère Forme
en utilisant la syntaxe super().__init__("cercle")
.
Dans la méthode surface de la classe Cercle, les méthodes getSurface
et setSurface
sont les méthodes de la classe mère (Forme
).
Si un objet Cercle
est construit et que la méthode perimetre
est appelé alors une exception car la méthode perimetre
n'est pas implémentée dans la classe Cercle
:
x =Cercle(1,2,5)
x.perimetre()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 9, in perimetre
NotImplementedError: La classe fille doit implémenter perimetre