Herencia simple y múltiple – Python – OOP

Siguiendo con programación orientada a objetos en Python (OOP) vamos a ver Herencia simple y múltiple.Herencia múltiple 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.

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


Descansando en la nube: login offEsto 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! 🙂

 

 


 

Sigue leyendo!
Entrada anterior! Siguiente entrada!

Compartir es agradecer! :)

11 comentarios en “Herencia simple y múltiple – Python – OOP”

  1. 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»)

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

  2. Jose Maria Carrascal Rojo

    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.

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

  3. Luis Alberto Quintero Laguna

    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

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

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

  5. Como siempre todo muy bien explicado, pero en esta ocasion si me queda una duda: porque en la linea de codigo ( print (f»Soy {self.nombre} tengo {self.edad} años y estudio Derecho») #Se presenta llamando los atributos)
    se debe usar dicha «f» para que los atributos lleguen al momento de llamar el metodo , pues esa «f» no la veo instanciada y no comprendo porque sin la misma los datos no se registran

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.