English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Python

Contrôle de flux Python

Fonctions en Python

Types de données en Python

Opérations de fichiers Python

Objets et classes Python

Dates et heures Python

Connaissances avancées Python

Manuel de référence Python

Héritage multiple en Python

Dans cet article, vous apprendrez ce qu'est le polymorphisme multiple en Python et comment l'utiliser dans un programme. Vous découvrirez également le polymorphisme multiple et l'ordre de résolution des méthodes.

Le polymorphisme multiple en Python

C ++CommeClasseIl est possible de dériver de plusieurs classes de base en Python. Cela s'appelle le polymorphisme multiple.

Dans le cas du polymorphisme multiple, les fonctionnalités de toutes les classes de base sont héritées par la classe dérivée. La syntaxe du polymorphisme multiple est similaire à celle d'une classe uniqueHéritage.

Exemple

class Base1:
    pass
class Base2:
    pass
class MultiDerived(Base1, Base2) :
    pass

Ici,MultiDerivedprovenant de la classeBase1etBase2.

La classe MultiDerived hérite de Base1et Base2Héritage.

Le polymorphisme multiple en Python

D'autre part, nous pouvons également hériter de la classe dérivée. Cela s'appelle le polymorphisme multiple. En Python, cela peut être de n'importe quelle profondeur.

Dans le cas du polymorphisme multiple, les fonctionnalités des classes de base et dérivées sont héritées par la nouvelle classe dérivée.

Ci-dessous est fourni un exemple avec une visualisation correspondante.

class Base:
    pass
class Derived1(Base):
    pass
class Derived2(Derived1) :
    pass

Ici,Derived1deBasedérivé,Derived2deDerived1Dérivé.

Method resolution order in Python

Chaque classe en Python dérive de cette classe object. C'est le type de base le plus élémentaire en Python.

Par conséquent, techniquement parlant, toutes les autres classes (primitives ou définies par l'utilisateur) sont des classes dérivées, et tous les objets sont des exemples de la classe object.

# Sortie: True
print(issubclass(list, object))
# Sortie: True
print(isinstance(5.5,object))
# Sortie: True
print(isinstance("Hello", object))

Dans le cas du polymorphisme multiple, toute propriété spécifiée sera recherchée en premier dans la classe actuelle. Si elle n'est pas trouvée, la recherche continuera en profondeur et de gauche à droite dans les classes parentes, sans avoir à rechercher deux fois la même classe.

Ainsi, dans l'exemple précédent, l'ordre de recherche de la classe MultiDerived est [MultiDerived, Base1, Base2, object]. This order is also known as the linearization of the MultiDerived class, and the set of rules used to find this order is called the " Method Resolution Order (MRO).

MRO must prevent local priority sorting and must also provide monotonicity. It can ensure that a class always appears before its parent class, and if there are multiple parent classes, its order is the same as the tuple of the base class.

The MRO of a class can be considered as the __mro__ attribute or mro() method. The former returns a tuple, while the latter returns a list.

>>> 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'>]

This is a slightly more complex multiple inheritance example and its visualization as well as 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())

Please refer to this content to furtherDiscuss MRO,and understand the actual calculation method of the algorithm.