CodeGym /Cours Java /Python SELF FR /Héritage multiple

Héritage multiple

Python SELF FR
Niveau 16 , Leçon 4
Disponible

10.1 Héritage de plusieurs classes

Héritage multiple en Python permet à une classe d'hériter des attributs et méthodes de plus d'une classe parente. Cela offre une grande flexibilité et permet de réutiliser le code, mais peut aussi entraîner des hiérarchies complexes et des conflits potentiels.

La possibilité d'écrire jusqu'à cinq parents pour votre classe élargit considérablement vos capacités et rend l'écriture de code très pratique. Pour le faire, il suffit d'énumérer les classes parentes en les séparant par une virgule :


class Base1:
    def method1(self):
        print("Method1 from Base1")
        
class Base2:
    def method2(self):
        print("Method2 from Base2")
        
class Derived(Base1, Base2):
    pass
        
obj = Derived()
obj.method1()
obj.method2()     
        

Tout fonctionne comme prévu — c'est beau.

Cependant, l'héritage multiple comporte quelques aspects complexes qu'il faut absolument prendre en compte lors de son utilisation. Voyons comment cela fonctionne et comment éviter les problèmes liés à l'héritage multiple.

10.2 Appel d'une méthode présente dans plusieurs classes de base

Une classe peut hériter des attributs et méthodes de plusieurs classes parentes répertoriées entre parenthèses après le nom de la classe. Ces attributs et méthodes peuvent avoir les mêmes noms:


class Base1:
    def method(self):
        print("Method from Base1")
        
class Base2:
    def method(self):
        print("Method from Base2")
        
class Derived(Base1, Base2):
    pass
        

obj = Derived()
obj.method() # quelle méthode sera appelée ici?
        

Dans cet exemple, la classe Derived hérite de Base1 et Base2. Quand on appelle method(), Python choisit la méthode du premier classe indiquée — Base1.

Mais ce n'est pas si évident, n'est-ce pas ? Et si quelqu'un change le code de la classe de base, toute la logique de l'application peut en être affectée, et vous ne saurez même pas que quelque chose ne va pas. Tout simplement, ce ne sera pas les bonnes méthodes qui seront appelées :)

10.3 Utilisation de super() avec l'héritage multiple

Une autre caractéristique intéressante est l'appel de super() pour la classe de base lors de l'héritage multiple.

Exemple :


class Base1:
    def method(self):
        print("Method from Base1")
        super().method()
        
class Base2:
    def method(self):
        print("Method from Base2")
        super().method()
        
class Derived(Base1, Base2):
    def method(self):
        print("Method from Derived")
        super().method()
         

obj = Derived()
obj.method()
        

Alors ? Quel sera le résultat à l'écran ?

Method from Derived
Method from Base1

Ou

Method from Derived
Method from Base2 

J'ai une surprise pour toi — le résultat sera le suivant :

Method from Derived
Method from Base1
Method from Base2

Le code super().method() appellera la méthode method() de chaque classe de base ! Ce sont justement ces petits détails dont j'ai parlé lors de la première mention de l'héritage multiple.

10.4 Héritage en diamant (Diamond)

Et enfin, le problème classique de l'héritage en diamant. Il est plus facile de le montrer par un exemple que de le décrire :

En code, cela peut ressembler à ceci par exemple :


class A:
    def method(self):
        print("Method from A")
        
class B(A):
    def method(self):
        print("Method from B")
        super().method()
        
class C(A):
    def method(self):
        print("Method from C")
        super().method()
        
class D(B, C):
    def method(self):
        print("Method from D")
        super().method()
         
         
        
obj = D()
obj.method()
        

Le résultat sera :

Method from D
Method from B
Method from C
Method from A 

Pour vous orienter un peu dans l'héritage multiple, vous devez bien comprendre dans quel ordre Python recherche les champs et méthodes des classes parentes. C'est précisément ce que vous découvrirez dans la prochaine leçon.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION