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