• 12 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 25/11/2024

Appliquez l’héritage dans votre code Python

Qu’est-ce que l’héritage ?

L’une des choses les plus utiles de la programmation orientée objet, c’est le concept d’héritage. L’héritage vous permet de créer une sous-classe (ou classe enfant) d’une classe parent, qui contient les attributs du parent ainsi que d’autres attributs spécifiques à l’enfant.

Prenons l’exemple de la bibliothèque de films d'un passionné de vieux films de science-fiction. Toute sa bibliothèque est constituée de films. En grand puriste, certains de ses films sont en format cassette ! 📼

Voici un exemple de deux classes : Film  et  FilmCassette.FilmCassetteest une sous-classe/classe enfant deFilm, etFilmest une superclasse/classe parent de  FilmCassette.

La classe parent Film a pour attributs name et watch(). Sa sous-classe FilmCassette a les mêmes attributs et aussi magnetic_tape et rewind(). A droite, il y a une instance d'un Film avec le name: Blade Runner, ainsi qu'une instance de FilmCassette avec l
FimCassette est une sous-classe/classe enfant de Film, et Film et une superclasse/classe parente de  FilmCassette. 

Notez quewatch()("Voir") etname("Nom") sont des attributs de Film dont  FilmCassette  hérite. Celui-ci ajoute également ses propres attributs :magnetic_tape (la "bande magnétique") etrewind() ("rembobiner").

Ce type de relation se produit souvent dans la vraie vie – avez-vous d’autres exemples en tête ?

Pourquoi l’héritage ?

Nous utilisons l’héritage en programmation orientée objet pour plusieurs raisons différentes, mais liées entre elles :

La réutilisabilité

La raison la plus simple est la même que celle pour laquelle nous écrivons des fonctions – la réutilisabilité.

Lorsque nous faisons de notre film de science-fiction une sous-classe de Film, nous n’avons pas besoin d’ajouter à nouveau notre attribut name, ni de réécrire notre méthodewatch().

Imaginez que nous ayons une douzaine de sous-classes de films de science-fiction – cela représenterait beaucoup de code copié-collé, en l’absence d’héritage ! Si vous vouliez modifier la fonctionnalité  watch(), il faudrait alors mettre à jour chaque sous-classe individuellement.

L'extensibilité

L’héritage permet également l’extensibilité – c’est-à-dire la possibilité d’étendre la fonctionnalité d’un programme sans avoir à modifier le code existant.

Imaginons que vous proposiez deux options pour contacter vos utilisateurs – par SMS ou par hibou 🧙‍♀️ :

A gauche, une instance ContactSystem avec l'attribut send(message). A droite, ses deux sous-classes : SMSContactSystem, avec les attributs phone_number, send(message) ; et OwlContactSystem, avec les attributs owl_name, coat_color, post_address, send(messa
Vous choisirez par SMS ou par hibou ?

Comme vous pouvez le constater, la classe  ContactSystem  définit un comportement –  send(message)  – et a comme sous-classes  SMSContactSystem  et  OwlContactSystem.

Si une classe  Utilisateur  contient un canal de contact favori – de type  ContactSystem  – nous savons que nous pouvons appeler  send()  dessus, et qu’on lui enverra ce message particulier avec l’option qu’il a choisie.

Au-delà de cela, imaginons que nous voulions étendre la fonctionnalité de notre système en ajoutant un nouveau moyen de contacter nos utilisateurs : par la poste. Si nous créons une sous-classe nommée  PostContactSystem  et que nous l’implémentons, nous n’avons rien à changer dans notre classe Utilisateur, ni dans aucune partie du code impliquée dans l’envoi de messages !

Nous ajoutons la sous-classe PostContactSystem au schéma précédent, avec pour attribut post_address et send(message).
Voilà notre nouvelle sous-classe pour la poste.

Les modèles

Enfin, l’un des avantages de l’héritage concerne la façon dont nous concevons les systèmes. L’héritage, et les classes en général, nous permettent d’exprimer des relations entre différentes parties de notre code.

Tout comme nous regroupons des données et du code au sein d’un paquet en utilisant les classes, nous relions les classes qui sont conceptuellement apparentées grâce à l’héritage. Nous entrerons plus en détail dans les hiérarchies d’héritage et les multiples niveaux d’héritage au chapitre 4.

Les classes et l’héritage sont utiles, car ils rendent les systèmes plus faciles à comprendre. Cela permet aux développeurs et aux équipes de développement de construire les modèles conceptuels des comportements et des données dans le système – ce qui prend encore plus d’importance lors de la maintenance et de l’extension de projets vastes et complexes.

À vous de jouer : utilisez l'héritage

À vous de jouer

Dans la première partie, vous avez fait un exercice impliquant d’identifier des classes dans une description de problème. Nous avons décomposé ces classes en état et comportement, par écrit.

Ci-dessous, vous trouverez quelques lignes décrivant une problématique. À partir de cette description, identifiez les classes, leurs état et comportement, et identifiez quelles classes sont les classes enfants/parents des autres.

Fort de votre expérience en pâtisserie, vous décidez de créer un forum en ligne pour parler de gâteaux ! 🥞🥮 Sur ce forum, les utilisateurs fans de pâtisserie pourront :

  • s’inscrire et se connecter ;

  • parler de leurs gâteaux préférés, en créant de nouveaux fils de discussion ;

  • répondre à des messages, dans les fils existants.

Un fil de discussion sur ce forum a un titre, une date de création et une collection de posts lui correspondant.

Chaque post contient du texte, l’utilisateur qui l’a publié et la date de publication.

Les utilisateurs ont la possibilité d’attacher des fichiers à leurs posts :

  • Partez du principe qu’il peut y avoir de nombreux types de fichiers, mais nous sommes surtout intéressés par les fichiers images.

  • Un post peut avoir un fichier attaché, ce qui changera la façon dont le post est affiché. Ce serait donc un nouveau type de post.

Enfin, il y a des utilisateurs spéciaux nommés modérateurs, qui ont la capacité de modifier un post pour qu’il contienne du contenu nouveau, et de supprimer ceux qui ne parlent pas de gâteaux. ;)

En résumé

  • Une classe peut avoir une classe parent, classe mère ou superclasse.

  • La classe qui a un parent est nommée sous-classe, classe fille ou classe enfant.

  • Cette classe hérite d’attributs de son parent.

  • La classe enfant peut implémenter des attributs supplémentaires, en plus de ceux dont elle hérite.

Maintenant que vous comprenez les concepts liés à l’héritage, rejoignez-moi au prochain chapitre, dans lequel nous écrirons quelques sous-classes.

Exemple de certificat de réussite
Exemple de certificat de réussite