CodeGym /Curso de Java /Python SELF ES /Herencia múltiple

Herencia múltiple

Python SELF ES
Nivel 16 , Lección 4
Disponible

10.1 Herencia de múltiples clases

Herencia múltiple en Python permite que una clase herede atributos y métodos de más de una clase padre. Esto ofrece gran flexibilidad y permite reutilizar el código, pero también puede llevar a jerarquías complejas y conflictos potenciales.

La capacidad de enumerar hasta cinco clases padre en tu clase realmente expande tus posibilidades y hace que escribir código sea muy conveniente. Hacer esto es muy sencillo — solo tienes que enumerar las clases padre separadas por comas:


class Base1:
    def method1(self):
        print("Method1 from Base1")
        
class Base2:
    def method2(self):
        print("Method2 from Base2")
        
class Derived(Base1, Base2):
    pass
        
obj = Derived()
obj.method1()
obj.method2()     
        

Todo funciona como estaba planificado — belleza pura.

Sin embargo, la herencia múltiple tiene varios lados complicados que debes tener en cuenta cuando la uses. Vamos a ver cómo funciona y cómo evitar problemas relacionados con la herencia múltiple.

10.2 Llamada a un método que existe en varias clases base

Una clase puede heredar atributos y métodos de varias clases padre enumeradas entre paréntesis después del nombre de la clase. Y esos atributos y métodos pueden tener los mismos nombres:


class Base1:
    def method(self):
        print("Method from Base1")
        
class Base2:
    def method(self):
        print("Method from Base2")
        
class Derived(Base1, Base2):
    pass
        

obj = Derived()
obj.method() # ¿de quién es el método que se llamará aquí?
        

En este ejemplo, la clase Derived hereda de Base1 y Base2. Cuando se llama a method(), Python elegirá el método de la primera clase mencionada — Base1.

Pero no es tan obvio, ¿verdad? Y si alguien cambia el código de la clase base, toda la lógica de la aplicación puede verse afectada, y ni siquiera sabrás que algo está mal. Simplemente comenzarán a llamarse los métodos incorrectos :)

10.3 Uso de super() con herencia múltiple

Otra característica interesante es la llamada a super() para la clase base en herencia múltiple.

Ejemplo:


class Base1:
    def method(self):
        print("Method from Base1")
        super().method()
        
class Base2:
    def method(self):
        print("Method from Base2")
        super().method()
        
class Derived(Base1, Base2):
    def method(self):
        print("Method from Derived")
        super().method()
         

obj = Derived()
obj.method()
        

¿Y bien? ¿Cuál será la salida en la pantalla?

Method from Derived
Method from Base1

O

Method from Derived
Method from Base2 

Te tengo una sorpresa — la salida será así:

Method from Derived
Method from Base1
Method from Base2

El código super().method() llamará al método method() en cada clase base! Estos son los matices de los que hablaba al mencionar por primera vez la herencia múltiple.

10.4 Herencia en forma de rombo (Diamond)

Y finalmente, el problema clásico de la herencia en forma de rombo. Es más fácil mostrarlo con un ejemplo que describirlo:

En forma de código, puede verse así, por ejemplo:


class A:
    def method(self):
        print("Method from A")
        
class B(A):
    def method(self):
        print("Method from B")
        super().method()
        
class C(A):
    def method(self):
        print("Method from C")
        super().method()
        
class D(B, C):
    def method(self):
        print("Method from D")
        super().method()
         
         
        
obj = D()
obj.method()
        

La salida será así:

Method from D
Method from B
Method from C
Method from A 

Para orientarte un poco en la herencia múltiple, necesitas conocer bien el orden en que Python busca campos y métodos en las clases padre. Precisamente de eso aprenderás en la próxima lección.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION