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

Tutorial Básica de Python

Control de flujo de Python

Funciones en Python

Tipos de datos en Python

Operaciones de archivos de Python

Objetos y Clases de Python

Fecha y Hora de Python

Conocimientos Avanzados de Python

Manual de Referencia de Python

Herencia múltiple en Python

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.

Herencia múltiple en Python

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.

Ejemplo

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

Aquí,MultiDerivedde la claseBase1yBase2.

La clase MultiDerived hereda de Base1y Base2Herencia.

Herencia de múltiples niveles en Python

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.

Method resolution order in Python

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.