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.
# 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 claseAves.Cada clase hija define si puede volar o no y el largo de sus alas.
Las instancias al final demuestran que heredan de
Avespero 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
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.