[Python] Herencia múltiple de clases

4.4 Herencia múltiple de clases

Al definir una clase en programación, si hereda varias clases, se llama 多重继承. Permite que las subclases hereden propiedades y métodos de varias clases principales diferentes. Por ejemplo, la clase Pegasus hereda de las clases Mammals y Birds:

class Animal:
    def eat(self):
        print('我饿了')

    def sleep(self):
        print('我困了')


class Mammal(Animal):
    def walk(self):
        print('我会走')


class Bird(Animal):
    def fly(self):
        print('我会飞')


class Tianma(Mammal, Bird):
    ...


tianma = Tianma()
tianma.eat()
tianma.sleep()
tianma.walk()
tianma.fly()

tengo hambre
tengo sueño
puedo caminar
puedo volar

4.4.1 MRO (Orden de Resolución de Sucesiones)

En Python, MRO significa Orden de resolución de métodos. Determina el orden en que se llaman los métodos cuando una subclase hereda varias clases principales.
Python usa el algoritmo C3 para calcular MRO. La regla básica es heredar todas las clases principales de izquierda a derecha, manteniendo el orden de la primera aparición de cada clase en la lista. Además, si una clase tiene varias superclases, Python intenta crear un MRO lineal fusionando secuencias de superclases.
Para encontrar un método, Python busca en la cadena MRO hasta que encuentra el método o llega al final de la cadena. Si el método requerido no se encuentra en ninguna clase, se genera una excepción AttributeError.
El siguiente es un fragmento de código de ejemplo que muestra cómo usar la función super() y la orden MRO para llamar al método de la clase principal:

class A:
    def foo(self):
        print("A")

class B(A):
    def foo(self):
        super().foo()
        print("B")

class C(A):
    def foo(self):
        print("C")

class D(B, C):
    pass

d = D()
d.foo()  # 输出 A B

En este ejemplo, la clase D hereda dos clases, B y C. Su orden MRO es [D, B, C, A], por lo que cuando llamamos al método d.foo(), Python primero llamará al método foo() en la clase B (debido al uso de la función super()) y luego buscará el método foo() en la clase A.
Puede ver la lista mro de una clase a través del atributo __mro__ de la clase:
>>> print( Tianma.mro )

(<clase ' principal .Tianma'>, <clase ' principal .Mamífero'>, <clase ' principal .Pájaro'>, <clase ' principal .Animal'>, <clase 'objeto'>)

Supongo que te gusta

Origin blog.csdn.net/crleep/article/details/131547974
Recomendado
Clasificación