Siguiendo con programación orientada a objetos en Python (OOP) vamos a ver Herencia simple y herencia múltiple y trataremos de aprender su aplicación y beneficios.Herencia múltiple en Python OOP

Cuando hablamos de clases hay una ventaja muy destacable que es la posibilidad de que un objeto perteneciente a una clase sea capaz de heredar los atributos y métodos de otra. El concepto de Herencia múltiple nos obliga a pensar en jerarquía de clases y aplicar estos conceptos a la hora de programar. La herencia múltiple permitirá crear objetos con atributos y métodos base.Si lo pensamos como si se tratara de animales sabemos por ejemplo que todas las aves tienen atributos en común; las alas, por ejemplo. Más allá de que puedan o no volar es un atributo en común que podríamos incluir en una clase «base» para no tener que incluirlo cada vez en cada clase creada para distintos objetos.Por ejemplo, tanto Ganso, como Pato, como Gallina serán aves, y también serán clases particulares que heredan de ave por lo tanto tendrán esos atributos y métodos de las aves incluidos más aquellos atributos y métodos que las hacen únicas. Veamos el siguiente código para explicar herencia múltiple con código python:

# Clase padre
class Aves:
    def __init__(self, nombre):
        self.nombre = nombre
        self.tiene_pico = True
        self.tiene_alas = True

    def describir(self):
        print(f"{self.nombre} tiene pico: {self.tiene_pico}, tiene alas: {self.tiene_alas}")

# Clase hija: Ganso
class Ganso(Aves):
    def __init__(self, nombre, puede_volar, largo_ala_cm):
        super().__init__(nombre)
        self.puede_volar = puede_volar
        self.largo_ala_cm = largo_ala_cm

    def detalles(self):
        self.describir()
        print(f"Puede volar: {self.puede_volar}, Largo de alas: {self.largo_ala_cm} cm")

# Clase hija: Pato
class Pato(Aves):
    def __init__(self, nombre, puede_volar, largo_ala_cm):
        super().__init__(nombre)
        self.puede_volar = puede_volar
        self.largo_ala_cm = largo_ala_cm

    def detalles(self):
        self.describir()
        print(f"Puede volar: {self.puede_volar}, Largo de alas: {self.largo_ala_cm} cm")

# Clase hija: Gallina
class Gallina(Aves):
    def __init__(self, nombre, puede_volar, largo_ala_cm):
        super().__init__(nombre)
        self.puede_volar = puede_volar
        self.largo_ala_cm = largo_ala_cm

    def detalles(self):
        self.describir()
        print(f"Puede volar: {self.puede_volar}, Largo de alas: {self.largo_ala_cm} cm")

# Instancias
ganso = Ganso("Ganso de Canadá", True, 170)
pato = Pato("Pato criollo", True, 100)
gallina = Gallina("Gallina de corral", False, 40)

# Mostrar detalles
print("=== GANSO ===")
ganso.detalles()

print("\n=== PATO ===")
pato.detalles()

print("\n=== GALLINA ===")
gallina.detalles()

Resultado:

  • odas las clases hijas (Ganso, Pato, Gallina) heredan los atributos comunes (tiene_pico, tiene_alas) desde la clase Aves.

  • Cada clase hija define si puede volar o no y el largo de sus alas.

  • Las instancias al final demuestran que heredan de Aves pero también tienen sus atributos propios.

🆚 Herencia simple vs Herencia Múltiple en Python

Herencia simple

La herencia simple tiene lugar cuando una clase hija hereda los atributos y métodos de una única clase padre. Vamos a proceder a crear dos clases, una principal y una secundaria, en esta última vamos a agregar la función de presentarse accediendo a los atributos de la clase padre.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Creamos la clase padre
class Estudiante(object):
    def __init__(self, edad, nombre):
        # Definimos los parámetros edad y nombre
        self.edad = edad  # Declaramos que el atributo edad es igual al argumento edad
        self.nombre = nombre  # Declaramos que el atributo nombre es igual al argumento nombre

# Creamos la clase hija
class Derecho(Estudiante):  # Entre paréntesis indicamos la clase padre (Estudiante)
    def presentarse(self):
        # Creamos el método presentarse
        print(f"Soy {self.nombre}, tengo {self.edad} años y estudio Derecho")  # Se presenta llamando los atributos

# Creamos una instancia de la clase Derecho
Manuel = Derecho(26, 'Manuel Contreras')  # Indicamos argumentos edad y nombre

# Llamamos al método y Manuel se presenta
Manuel.presentarse()

Resultado:

Soy Manuel Contreras tengo 26 años y estudio Derecho

Cómo ves asignamos al objeto «Manuel» la clase«Derecho» que hereda los atributos de «Estudiante». De lo contrario obtendremos un error porque los atributos nombre y edad pertenecen a Estudiante.

Recuerda que para declarar una clase lo hacemos utilizando el constructor __init__ y entre paréntesis los parámetros a los que les daremos argumentos a la hora de crear un objeto a partir de esta clase (instanciar)

Class Nombredelaclase (object):

def constructor_init (self,parámetros):

Declaración

Y si queremos que nuestra clase herede los atributos o métodos de otra clase principal (contiene el constructor init)

Class Nombredelaclase (clasepadre):

Declaraciones

Cuando creamos una clase hija no es necesario volver a incluir el constructor __Init__ si la clase padre o principal ya lo contiene.

Clase base o padre

Para que sea posible la herencia de atributos y métodos de una clase, debe existir la superclase o clase principal de la cual la clase hija o secundaria va a heredar. Es decir, para que exista un hijo debe de existir un padre.

Supongamos que nosotros heredamos algunas virtudes y defectos de nuestros padres. Ellos serían nuestras clases primarias, o base. Y nosotros seríamos la secundaria o hija.

✅ Herencia Múltiple

Los casos de herencia múltiple en python se dan cuando una clase secundaria o hija hereda atributos y métodos de mas de una clase principal o padre. Basta con separar con una coma ambas principales a la hora de crear la clase secundaria:

Class Nombredelaclase (clasepadre1, clasepadre2):

Declaraciones

Esta clase hija habrá de heredar atributos y métodos de ambas clases (clasepadre1 y clasepadre2).

Veamos un ejemplo de herencia múltiple con el mismo código anterior pero creando ahora una clase correspondiente al instituto.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Creamos la clase padre
class Estudiante(object):
    def __init__(self, edad, nombre):
        # Definimos los parámetros edad y nombre
        self.edad = edad  # Declaramos que el atributo edad es igual al argumento edad
        self.nombre = nombre  # Declaramos que el atributo nombre es igual al argumento nombre

# Creamos otra clase padre
class Instituto(object):
    def presentarinstituto(self):
        # Método para presentar el instituto
        print("Estudio en el Instituto de Leyes 112")

# Creamos la clase hija que hereda de Estudiante e Instituto
class Derecho(Estudiante, Instituto):  # Herencia múltiple
    def presentarse(self):
        # Creamos el método presentarse
        print(f"Soy {self.nombre}, tengo {self.edad} años y estudio Derecho")  # Se presenta llamando los atributos

# Creamos una instancia de la clase Derecho
Manuel = Derecho(26, 'Manuel Contreras')  # Indicamos argumentos edad y nombre

# Llamamos a los métodos
Manuel.presentarse()        # Manuel se presenta
Manuel.presentarinstituto() # Manuel presenta su instituto

Resultado:

Soy Manuel Contreras tengo 26 años y estudio Derecho
Estudio en el Instituto de Leyes 112

Como podemos ver la clase Derecho ahora hereda de la clase principal Estudiante e Instituto. Por eso aunque el objeto «Manuel» pertenezca a la clase Derecho, se nos permite utilizar el método «Manuel.presentarinstituto()» que corresponde a la clase Instituto.

➡️ Ventajas de la herencia múltiple en python 

herencia múltiple en python 3Una de las principales ventajas es la reutilización de código permitiéndonos establecer una relación entre clases evitando que sea necesario volver a declarar ciertos métodos o atributos.

Las clases nos permiten construir objetos sobre una colección de atributos y métodos definidos de forma abstracta. Y la capacidad de herencia nos permitirá crear clases secundarias más grandes y capaces heredando múltiples atributos y métodos de otras así como también más específicas controlando los mismos para una única clase particular.

 

¡Compartir es una forma de agradecer! :)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio