Héritage multiple Python
Héritage multiple Python
Dans ce didacticiel, vous découvrirez l'héritage multiple en Python et comment l'utiliser dans votre programme. Vous découvrirez également l'héritage à plusieurs niveaux et l'ordre de résolution des méthodes.
Héritage multiple Python
Une classe peut être dérivée de plusieurs classes de base en Python, comme en C++. C'est ce qu'on appelle l'héritage multiple.
Dans l'héritage multiple, les fonctionnalités de toutes les classes de base sont héritées dans la classe dérivée. La syntaxe de l'héritage multiple est similaire à celle de l'héritage unique.
Exemple
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
Ici, le MultiDerived la classe est dérivée de Base1 et Base2 cours.

Le multidérivé la classe hérite des deux Base1 et Base2 cours.
Héritage multiniveau Python
On peut aussi hériter d'une classe dérivée. C'est ce qu'on appelle l'héritage multiniveau. Il peut être de n'importe quelle profondeur en Python.
Dans l'héritage multiniveau, les fonctionnalités de la classe de base et de la classe dérivée sont héritées dans la nouvelle classe dérivée.
Un exemple avec la visualisation correspondante est donné ci-dessous.
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Ici, le Derived1 la classe est dérivée de la Base classe, et la classe Derived2 la classe est dérivée de Derived1 classe.

Ordre de résolution des méthodes en Python
Chaque classe en Python est dérivée du object
classer. C'est le type le plus basique de Python.
Donc, techniquement, toutes les autres classes, qu'elles soient intégrées ou définies par l'utilisateur, sont des classes dérivées et tous les objets sont des instances du object
classe.
# Output: True
print(issubclass(list,object))
# Output: True
print(isinstance(5.5,object))
# Output: True
print(isinstance("Hello",object))
Dans le scénario d'héritage multiple, tout attribut spécifié est recherché en premier dans la classe actuelle. S'il n'est pas trouvé, la recherche se poursuit dans les classes parentes en profondeur d'abord, de gauche à droite sans rechercher deux fois la même classe.
Ainsi, dans l'exemple ci-dessus de MultiDerived
classe l'ordre de recherche est [MultiDerived
, Base1
, Base2
, object
]. Cet ordre est aussi appelé linéarisation de MultiDerived
class et l'ensemble de règles utilisé pour trouver cette commande est appelé Method Resolution Order (MRO) .
Le MRO doit empêcher l'ordre de priorité local et également assurer la monotonie. Il garantit qu'une classe apparaît toujours avant ses parents. En cas de parents multiples, l'ordre est le même que pour les tuples des classes de base.
Le MRO d'une classe peut être considéré comme le __mro__
attribut ou le mro()
méthode. Le premier renvoie un tuple tandis que le second renvoie une liste.
>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>]
Voici un exemple d'héritage multiple un peu plus complexe et sa visualisation avec le MRO.

# Demonstration of MRO
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())
Sortie
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Pour connaître l'algorithme réel sur la façon dont le MRO est calculé, visitez Discussion sur le MRO.
Python