• 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 07/03/2022

Utilisez les hiérarchies d’héritage et l’héritage multiple

Créez des hiérarchies d’héritage

Si une classe peut avoir une classe parent, alors logiquement cette classe parent peut également avoir un parent ! C’est une hiérarchie d’héritage qui émerge de cela, car il y a de multiples niveaux d’héritage. En haut de la hiérarchie, on trouve la classe de base, comme ceci :

L'hiérarchie de l'héritage Film : tout en haut, Film est la classe parent de FilmCassette et FilmDVD. FilmCassette a pour sous-classes FilmCassetteVHS et FilmCassetteSVHS
Nous pouvons spécialiser nos classes et nos sous classes de Film pour créer une véritable hiérarchie de classes.

Dans cette hiérarchie,  FilmCassette  et  FilmDVD  sont des sous-classes deFilm, et  FilmCassetteVHS  et  FilmCassetteSVHS  sont des sous-classes deFilmCassette.

Nous pouvons observer que :

  1. FilmCassette  hérite de  Film.

  2. FilmCassetteVHS  hérite de  FilmCassette.

Ainsi, les attributs de  Film  se retrouvent dans la classe  FilmCassetteVHS  également !

Notre projet peut contenir une hiérarchie Film, mais aussi, séparément, des livres ou des BD. N’oubliez pas que l’orientation objet et l’héritage tournent autour des relations entre les concepts.

Mais toutes les classes n’héritent-elles pas d’  Object  en Python ? Donc elles auront une classe de base commune de toute façon, non ?

Si ! Néanmoins, on ne fait généralement pas figurer  Object  sur les diagrammes d’héritage, car il n’est pas très utile de l’inclure. Nous discuterons davantage de la modélisation et de la conception de solutions orientées objet à des problèmes dans la Partie 3, dans les chapitres Utilisez les modules et les classes pour découper votre code et Décomposez un problème de programmation orientée objet.

Utilisez l'héritage multiple

En quoi l’héritage multiple est-il différent d’une hiérarchie d’héritage ?

L’héritage multiple suppose qu’une classe ait de multiples classes parents. Dans une hiérarchie d’héritage, il y a plusieurs niveaux d’héritage – une classe a un parent qui a un parent.

L’héritage multiple a mauvaise réputation en programmation orientée objet – les systèmes qui utilisent l’héritage multiple peuvent être difficiles à comprendre. De plus, certains langages de programmation proposent des implémentations médiocres d’héritages multiples qui provoquent des problèmes.

Le plus souvent, l’héritage multiple n’est pas une bonne solution à votre problème, mais il n’en reste pas moins qu’il existe quelques situations où il représente la meilleure solution possible. En tout cas, comme vous risquez de rencontrer l’héritage multiple dans votre activité professionnelle, nous le traiterons donc ici.

Voici un exemple :

class Cat:
    """Un chat."""

    def meow(self):
        """Miaule."""
        print("Meow!")


class Talker:
    """Interface qui définit la méthode "say" (dire)."""
     
    def say(self, to_say):
        """Affiche "to_say" (à dire)."""
        print(to_say)


class TalkingCat(Cat, Talker):
    """Un chat qui parle ??"""
    pass


salem = TalkingCat()
salem.meow()
salem.say("Hello!")

Ici, nous avons une classe  Cat  ("Chat") et une classe  Talker  ("Parlant"), et notre classe  TalkingCat  ("ChatQuiParle") hérite des deux. Par conséquent, unTalkingCat, comme notre Salem ici, a la capacité de miauler et de parler !

Attendez, que se passe-t-il si deux classes parents implémentent la même méthode ? Laquelle va gagner ?

C’est là l’un des problèmes principaux de l’héritage multiple – on l’appelle le problème du diamant (ou le « Deadly Diamond of Death », soit littéralement le « diamant de la mort qui tue » 💀). Chaque langage qui utilise l’héritage multiple a sa propre solution – celle de Python s’appelle le MRO, pour Method Resolution Order : l’ordre de résolution de méthode.

Expliqué simplement, le MRO d’une classe constitue l’ordre des emplacements où Python va chercher une définition de méthode. Ceci peut devenir assez compliqué – si vous souhaitez obtenir davantage d’informations à ce sujet, vous les trouverez dans la documentation Python.

De façon générale, néanmoins, Python cherchera dans la classe parent la plus à gauche en premier. Donc, dans notre exemple  TalkingCat  ci-dessus, Python cherchera d’abord dans Cat, puis dans Talker.

À vous de jouer : utilisez de multiples niveaux d’héritage

À vous de jouer

Reprenons le forum que vous construisez et imaginons qu’une Image puisse être soit un GIF, soit un JPG. Implémentez ces sous-classes d’Image, puis surchargez la méthode d’affichage de chacune d’entre elles pour inclure également une référence à son type.

En résumé

  • Une classe parent peut elle-même avoir un parent.

  • Lorsque nous avons de multiples niveaux d’héritage, nous avons une hiérarchie d’héritage.

  • Une classe peut aussi hériter de multiples classes parents dans le cadre de ce que l’on nomme l’héritage multiple.

Maintenant que vous comprenez les différents types d’héritage, nous pouvons commencer à utiliser des objets dans notre code – y compris avec des collections.

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