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