👾 Herencia múltiple en Python – OOP

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.

📓 Abre tu cuaderno de Jupyter Notebook que creaste en la lección anterior (12-Clases en Python) y vamos a crear un nuevo cuaderno para esta lección. Llámalo 13-Herencia múltiple en Python.

herencia multiple en python

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.

📚 Recursos externos para profundizar: Consulta la documentación oficial de Python sobre herencia y la guía de herencia múltiple en Python.

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 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:
=== GANSO ===
Ganso de Canadá tiene pico: True, tiene alas: True
Puede volar: True, Largo de alas: 170 cm

=== PATO ===
Pato criollo tiene pico: True, tiene alas: True
Puede volar: True, Largo de alas: 100 cm

=== GALLINA ===
Gallina de corral tiene pico: True, tiene alas: True
Puede volar: False, Largo de alas: 40 cm
  • Todas 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

📊 Comparativa: Herencia Simple vs Herencia Múltiple
Característica Herencia Simple Herencia Múltiple
Definición Una clase hija hereda de una única clase padre. Una clase hija hereda de dos o más clases padres.
Sintaxis class Hija(Padre): class Hija(Padre1, Padre2):
Complejidad Baja (fácil de entender y depurar). Media/Alta (puede generar conflictos de nombres).
Uso de super() Llama al constructor de la única clase padre. Llama a los constructores en orden (MRO).
Ejemplo típico `Estudiante` → `Derecho` `Estudiante` + `Instituto` → `Derecho`

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 __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 más 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 3

Una 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.

📌 Resumen de herencia en Python
  • Herencia simple: Una clase hija hereda de una única clase padre.
  • Herencia múltiple: Una clase hija hereda de dos o más clases padres.
  • super(): Permite llamar a métodos de la clase padre.
  • Ventaja principal: Reutilización de código y jerarquía de clases.

🔍 Próximo paso: En la siguiente entrada veremos la función super() en detalle, que nos permite acceder a métodos de la clase padre de forma elegante.

📚 Para seguir el curso en orden, visita nuestra guía completa de Python básico.

📅 Última actualización: julio 28, 2026

¡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