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 :
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 :
FilmCassette
hérite deFilm
.FilmCassetteVHS
hérite deFilmCassette
.
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
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.