English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este artículo, aprenderá qué es la herencia múltiple en Python y cómo usarla en programas. También aprenderá sobre la herencia de múltiples niveles y el orden de resolución de métodos.
C ++comoclaseSe puede derivar de múltiples clases base en Python. Esto se llama herencia múltiple.
En la herencia múltiple, todas las funciones de las clases base se heredan a la subclase. La sintaxis de la herencia múltiple es similar a la de unaHerencia.
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2) : pass
Aquí,MultiDerivedde la claseBase1yBase2.
La clase MultiDerived hereda de Base1y Base2Herencia.
Por otro lado, también podemos heredar la subclase. Esto se llama herencia de múltiples niveles. En Python puede ser de cualquier profundidad.
En la herencia de múltiples niveles, las funciones de la clase base y la subclase se heredan a la nueva subclase.
A continuación, se proporciona un ejemplo con el efecto visual correspondiente.
class Base: pass class Derived1(Base): pass class Derived2(Derived1) : pass
Aquí,Derived1deBasehereda,Derived2deDerived1Herencia.
Cada clase en Python deriva de esta clase object. Es el tipo más básico en Python.
Por lo tanto, técnicamente, todos los demás tipos de clase (integrados o definidos por el usuario) son subclases, y todos los objetos son ejemplos de la clase object.
# Salida: True print(issubclass(list, object)) # Salida: True print(isinstance(5.5,object)) # Salida: True print(isinstance("Hello", object))
En el esquema de herencia múltiple, se buscará primero cualquier propiedad especificada en la clase actual. Si no se encuentra, la búsqueda continuará en profundidad primero, de izquierda a derecha, entrando en las clases padre sin buscar la clase dos veces.
Por lo tanto, en el ejemplo anterior, el orden de búsqueda de la clase MultiDerived es [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.