Herencia múltiple de Python
Herencia múltiple de Python
En este tutorial, aprenderá sobre la herencia múltiple en Python y cómo usarla en su programa. También aprenderá sobre la herencia multinivel y el orden de resolución de métodos.
Herencia múltiple de Python
Una clase se puede derivar de más de una clase base en Python, similar a C++. Esto se llama herencia múltiple.
En la herencia múltiple, las características de todas las clases base se heredan en la clase derivada. La sintaxis de la herencia múltiple es similar a la herencia única.
Ejemplo
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
Aquí, el Multiderivado la clase se deriva de Base1 y Base2 clases.
El Multiderivado la clase hereda de ambos Base1 y Base2 clases.
Herencia multinivel de Python
También podemos heredar de una clase derivada. Esto se llama herencia multinivel. Puede ser de cualquier profundidad en Python.
En la herencia multinivel, las características de la clase base y la clase derivada se heredan en la nueva clase derivada.
A continuación se proporciona un ejemplo con la visualización correspondiente.
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Aquí, el Derivado1 la clase se deriva de la Base clase, y el Derivado2 la clase se deriva de Derived1 clase.
Orden de resolución de métodos en Python
Cada clase en Python se deriva del object
clase. Es el tipo más básico en Python.
Entonces, técnicamente, todas las demás clases, ya sean integradas o definidas por el usuario, son clases derivadas y todos los objetos son instancias del object
clase.
# Output: True
print(issubclass(list,object))
# Output: True
print(isinstance(5.5,object))
# Output: True
print(isinstance("Hello",object))
En el escenario de herencia múltiple, cualquier atributo especificado se busca primero en la clase actual. Si no se encuentra, la búsqueda continúa en las clases principales en profundidad primero, de izquierda a derecha sin buscar la misma clase dos veces.
Entonces, en el ejemplo anterior de MultiDerived
clase el orden de búsqueda es [MultiDerived
, Base1
, Base2
, object
]. Este orden también se llama linealización de MultiDerived
clase y el conjunto de reglas que se utilizan para encontrar este orden se llama Orden de resolución de métodos (MRO) .
MRO debe evitar el orden de precedencia local y también proporcionar monotonicidad. Asegura que una clase siempre aparezca antes que sus padres. En caso de padres múltiples, el orden es el mismo que el de las tuplas de las clases base.
El MRO de una clase se puede ver como el __mro__
atributo o el mro()
método. El primero devuelve una tupla mientras que el segundo devuelve una lista.
>>> 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'>]
Aquí hay un ejemplo de herencia múltiple un poco más complejo y su visualización junto con el 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())
Salida
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Para conocer el algoritmo real sobre cómo se calcula MRO, visite Discusión sobre MRO.
python