Siguiendo con programación orientada a objetos en Python (OOP) vamos a ver Herencia simple y múltiple.
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.
Herencia simple vs Herencia Multiple
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 -*- # class Estudiante(object): #Creamos la clase padre 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 class Derecho (Estudiante): #Entre paréntesis indicamos la clase padre o principal ESTUDIANTE #Lo que la convierte a DERECHO en una clase hija o secundaria 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 Manuel = Derecho(26, 'Manuel Contreras') #Indicamos argumentos edad y nombre Manuel.presentarse() # Llamamos al método y Manuel se presenta
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 asignarle la clase a algún objeto.
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 metodos 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 metodos 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 -*- # class Estudiante(object): #Creamos la clase padre 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 class Instituto(object): def presentarinstituto (self): print("""Estudio en el Instituto de Leyes 112""") class Derecho (Estudiante, Instituto): #Entre paréntesis indicamos la clase padre o principal ESTUDIANTE #Lo que la convierte a DERECHO en una clase hija o secundaria 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 Manuel = Derecho(26, 'Manuel Contreras') #Indicamos argumentos edad y nombre Manuel.presentarse() # Llamamos al método y Manuel se presenta Manuel.presentarinstituto()
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
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.
Esto ha sido todo y espero hayas logrado comprender algo de herencia múltiple en python, si aún no has visto clases te recomiendo pasarte por la entrada anterior. Hasta luego! Bye bye! Ha y no olvides dejar un comentario o suscribirte a mi blog! 🙂
Entrada anterior! | Siguiente entrada! |
Muy buena explicación.
Magnífico trabajo. Muy bien explicado, muy didáctico. Tienes toda mi admiración. Enhorabuena.
Soy muy muy novato en esto, y quisiera hacer una pequeña pregunta, que espero no sea impertinente: ¿No sería más legible algo así?
print (f”Soy {self.nombre} tengo {self.edad} años y estudio Derecho”)
Hola @carles_garrigues:disqus muchas gracias!. Claro que sería mejor incluir formateo, en los tiempos que redacte la entrada no los añadí porque aún no había desarrollado formatos si no me equivoco y no quería incluir lo que no había redactado con anterioridad..
Ahora añado tu recomendación!. Gracias por leer el blog, mis saludos!
Buenas, estoy empezando a aprender Python con tu blog. Y me ha quedado la duda de porque para que se imprima por pantalla los argumentos tenemos que escribir una f en el inicio del print(….). No sé si lo explicaras más adelante porque voy entrada a entrada, y creo que no lo has explicado en alguna antes, pero creo que vendría bien un pequeño comentario. Gracias y un saludo,eres un crack.
Hola @josemariacarrascalrojo:disqus es solo para darle formato a las cadenas de caracteres (llamadas f-strings).. Al igual que puedes usar “.format”. Lamentablemente no he dedicado una entrada a fstring pero si a Format en python. Tal vez lo añada en esa misma entrada, gracias por tu comentario y te deseo buena suerte en tu aprendizaje!. Happy coding!
La verdad Amigo, tienes un Don que debes explotar, el don de la pedagogia, enseñar y no quedarte con el conocimiento, leia con detalle tus explicaciones y de verdad me quito el sombrero, eres muy explicativo y detallista, quien este dispuesto a aprender como es mi caso te seguiremos y recomendaremos…. Saludos
Gracias @luisalbertoquinterolaguna:disqus la verdad estos comentarios me inspiran a seguir este camino, muchas gracias por tomarte el tiempo de agradecer! Un saludo cordial y mucha suerte en tu aprendizaje!
Genial primera vez que comprendo algo, aunque si entendía, pero no comprendía el porqué de las herencias.
Hola, muy bien explicado, estoy tomando el curso Universidad de Python y me atore en un ejercicio de herencia Multiple, me ayudo mucho la información que compartes en entender y darle solución al problema.