Bienvenue dans notre cours ‘Programmation orientée objet en Python’. Alors, dans cette partie de cours, on va découvrir l’héritage en python.
héritage en python
Dans la partie précédente, nous avons décrit la relation d’héritage. Cette relation qui peut exister entre classes, impose d’avoir une classe mère et une ou plusieurs classes filles.
Ainsi, l’implémentation de cette relation , dans un langage de programmation orienté objet, revient à programmer la classe mère et ses classes filles. Puis, utiliser les objets de la classe voulue.
Exemple
Dans l’exemple suivant, on a une classe mère Personne qui a les attributs nom et prénom. Pour le moment, on laisse les attributs publics (on va appliquer le principe d’encapsulation après). Aussi, la classe Personne a une méthode AfficherInfos qui affiche les informations d’une personne. Puis on a une classe fille Stagiaire. C’est à dire, un stagiaire est une personne (il hérite le nom, le prénom et la méthode AfficherInfos) :
#classe mère
class Personne:
def __init__(self,n,p):
self.nom=n
self.prenom=p
def AfficherInfos(self):
print("nom: ",self.nom,"prénom: ",self.prenom)
#classe fille
class Stagiaire(Personne):
def __init__(self,n,p,notes):
Personne.__init__(self,n,p) #self.nom=n
self.notes=notes #self.prenom=p
def AfficherNotes(self):
print(self.notes)
def AfficherInfos(self):#Redéfinition
Personne.AfficherInfos(self)
#print("nom: ",self.nom,"prénom: ",self.prenom)
self.AfficherNotes() # print(self.notes)
Explications :
- La classe mère se programme comme une classe normale. C’est à dire, la relation d’héritage n’a aucun apport pour cette classe. En effet, on crée la classe avec ses attributs et ses méthodes de façon normale.
- Dans la classe fille : on ajoute juste les nouveaux attributs (s(ils existent). Par exemple, nous avons ajouté l’attribut notes pour un stagiaire. C’est un nouveau attribut, spécifique à la classe stagiaire.
- Pour le constructeur de la classe fille : il doit permettre l’initialisation de tous les attributs (hérités et spécifiques). D’où, le nombre de ses paramètres est égal au nombres des tous attributs plus le self.
- Dans le constructeur de la classe fille: on fait appel au constructeur de la classe mère pour s’occuper des attributs hérités. C’est le rôle de l’instruction : Personne.__init__(self, nom, prenom). Même-ci, la classe fille peut , elle-même, initialiser tous ses attributs, c’est mieux de transmettre les éléments hérités à la classe mère. En effet, le grand avantage de l’héritage est la notion de réutilisation. En d’autre termes, pas la peine de refaire tous si on a une mère qui peut s’occuper d’une partie (les éléments hérités) pour toutes ses filles.
- La classe fille peut avoir ses propres méthodes. Dans, l’exemple, la classe Stagiaire a une méthode propre à elle qui est AfficherNotes.
La redéfinition
La classe fille a hérité la méthode AfficherInfos de sa classe mère Personne. Mais, la méthode héritée ne peut afficher que le nom et le prénom. En fait, elle ne connait pas l’attribut notes. Donc, si la classe Stagiaire ne redéfinit pas la méthode AfficherInfos , elle doit toujours compléter l’affichage de ses informations par AfficherNotes. Autrement dit, si la classe fille a hérité une méthode de sa classe mère, et pense que cette méthode héritée est imcomplète. Alors, elle peut la redéfinir. C’est ce qu’on appelle : la redéfinition.
Définition :
La redéfinition consiste à créer , dans la classe fille, une méthode de la même nom qu’une méthode héritée. Aussi, les paramètres doivent restés identiques (même nombres de paramètres et même types).
héritage en python : la fonction super()
La fonction super() est une fonction python Built-in. Elle permet de désigner la classe mère sans avoir besoin de connaitre son nom. Ainsi, le code de la classe fille peut devenir :
#classe fille
class Stagiaire(Personne):
def __init__(self,n,p,notes):
super().__init__(n,p)
self.notes=notes
def AfficherNotes(self):
print(self.notes)
def AfficherInfos(self):#Redéfinition
super().AfficherInfos()
#print("nom: ",self.nom,"prénom: ",self.prenom)
self.AfficherNotes() # print(self.notes)
L’utilisation de la fonction super() permet d’omettre le paramètre self. Le résultat reste le même, c’est la syntaxe qui devient plus légère!
héritage en python : création des objets
Une fois les classes (filles et mère) sont définit, alors, les objets peuvent etre crées et utiliser selon l’objectif à atteindre.
Exemple : créer un objet p1 de la classe Personne et un autre ibjet s1 de sa classe fille Stagiaire
p1=Personne("n1","p1")
p1.AfficherInfos()
s1=Stagiaire("ns1","ps1",[12,19,10])
s1.AfficherInfos()
Explications :
- Pour créer p1, on a fait appel au constructeur de la classe Personne et on a donné des valeurs pour le nom et le prénom.
- p1.AfficherInfos() permet d’afficher les informations de la personne p1. En effet , ici , on a un appel à la méthode AfficherInfos de la classe mère Personne (c’est la classe de l’objet p1).
- La création de s1 nécessite l’appel du constructeur de la classe fille Stagiaire. D’où, on doit donner le nom, le prénom et les note du stagiaire à créer.
- s1.AfficherInfos() permet d’invoquer la méthode AfficherInfos redéfinies dans la classe Stagiaire. D’où, elle affiche toutes les informations y compris les notes.
Attention : dans cette partie , nous avons définit les attributs public. Chose qui est incorrectes selon le principe d’encapsulation. Nous l’avons fait simplement pour ne pas agrandir le code et donc, se focaliser sur l’implémentation de la relation d’héritage. Pour compléter cette partie , vous devez voir la partie suivante qui va traiter l’encapsulation et l’héritage.
Vous pouvez suivre notre liste des vidéos sur la programmation orientée objet sur notre chaine youtube 9raytifclick (Darija: arabe marocaine) : POO en Python
Aussi, si vous voulez commencer l’apprentissage d’un langage de programmation, voilà notre cours : Langage Python Niveau 1 qui sera très utile pour vous (il vous aide à pratiquer tous les éléments de base de la programmation ; vus dans notre cours d’algorithmique).