Curso de Python. POO VIII. Herencia III. Vídeo 31

Curso de Python. POO VIII. Herencia III. Vídeo 31

Introducción al tema de la herencia en programación orientada a objetos

Resumen de la sección: En esta sección del curso de programación en Python, se aborda el tema de la herencia dentro de la programación orientada a objetos. Se hace referencia al concepto de herencia múltiple y se mencionan dos funciones importantes para trabajar con la herencia: super e instance.

Uso de las funciones super e instance

  • La función super permite llamar al método de la clase padre en cualquier parte del código.
  • Ejemplo:
  • La función instance también es utilizada en el contexto de la herencia.
  • Ejemplo:

Preferencia en caso de herencia múltiple

  • Cuando hay herencia múltiple, se le da preferencia a la clase que está más a la izquierda.
  • Ejemplo:

Problema con métodos con el mismo nombre

  • Si existen métodos con el mismo nombre en las clases involucradas en una herencia múltiple, se utilizará el método correspondiente a la clase más a la izquierda.
  • Ejemplo:

Solución elegante utilizando la función super

  • Para evitar conflictos con los parámetros pasados a un objeto que pertenece a una clase con herencia múltiple, se puede utilizar la función super.
  • Ejemplo:

Uso práctico de la función super

  • Se muestra un ejemplo sencillo para comprender mejor cómo funciona y cómo aplicar correctamente la función super.
  • Ejemplo:

Creación de clases y objetos

  • Se crea una clase "Persona" y una clase "Empleado" para construir objetos con características específicas.
  • Ejemplo:

Constructor de la clase "Persona"

  • Se define el constructor de la clase "Persona" con los parámetros nombre, edad y lugar de residencia.
  • Ejemplo:

Inicialización de los parámetros en el constructor

  • Dentro del constructor, se inicializan los parámetros pasados al objeto.
  • Ejemplo:

Uso de la función super en herencia avanzada

Resumen de la sección: En esta sección, se profundiza en el uso de la función super en casos más complejos de herencia.

Implementación del método constructor utilizando super

  • Se muestra cómo utilizar la función super en el método constructor para evitar repeticiones innecesarias.
  • Ejemplo:

Continuación del ejemplo anterior

  • Se retoma el ejemplo anteriormente mencionado para aplicar el uso correcto de la función super.
  • Ejemplo:

Ventajas del uso de super

  • El uso adecuado de la función super permite un código más limpio y evita duplicaciones innecesarias.
  • Ejemplo:

Creación de la clase Persona

Resumen de la sección: En esta sección, se crea la clase "Persona" con un constructor que recibe parámetros como nombre, edad y lugar de residencia. Además, se agrega un método llamado "descripción" que imprime en consola los valores de las propiedades de una persona.

Creación de la clase Persona

  • Se crea la clase "Persona" con un constructor que recibe parámetros como nombre, edad y lugar de residencia.
  • Se agrega el método "descripción" a la clase Persona, el cual imprime en consola los valores de las propiedades (nombre, edad y lugar de residencia).

Creación de la clase Empleado

Resumen de la sección: En esta sección, se crea la clase "Empleado" que hereda las propiedades y métodos de la clase "Persona". Además, se agregan nuevas propiedades como salario y antigüedad.

Creación de la clase Empleado

  • Se crea la clase "Empleado" con un constructor que recibe parámetros como salario y antigüedad.
  • La clase Empleado hereda las propiedades (nombre, edad y lugar de residencia) y el método descripción() de la clase Persona.

Relación entre Empleado y Persona

Resumen de la sección: En esta sección, se establece que un empleado es una persona además de tener características adicionales como salario y antigüedad.

Relación entre Empleado y Persona

  • Un empleado es una persona, por lo tanto, también tiene propiedades como nombre, edad y lugar de residencia.

Creación de objetos de tipo Persona y Empleado

Resumen de la sección: En esta sección, se crean objetos de tipo Persona y Empleado utilizando el constructor correspondiente y se asignan valores a las propiedades.

Creación de objetos de tipo Persona y Empleado

  • Se crea un objeto de tipo Persona llamado "Antonio" con nombre, edad y lugar de residencia especificados.
  • Se crea un objeto de tipo Empleado llamado "Antonio" con salario y antigüedad especificados.

Uso del método descripción()

Resumen de la sección: En esta sección, se muestra cómo utilizar el método descripción() para imprimir las características del objeto creado.

Uso del método descripción()

  • Se utiliza el método descripción() para imprimir las características del objeto "Antonio".

Problemas al crear un objeto Empleado

Resumen de la sección: En esta sección, se presentan problemas al intentar crear un objeto Empleado debido a los parámetros requeridos por su constructor.

Problemas al crear un objeto Empleado

  • Al intentar crear un objeto Empleado sin proporcionar los parámetros correctos (nombre, edad y lugar de residencia), ocurre un error en el constructor.
  • Si solo proporcionamos los parámetros requeridos por el constructor del objeto Empleado (salario y antigüedad), el código puede parecer que funciona, pero se produce un error al intentar utilizar el método descripción().

Conclusion

En este video se muestra cómo crear clases en Python utilizando la herencia. Se crea una clase "Persona" con propiedades como nombre, edad y lugar de residencia, y un método para imprimir una descripción de la persona. Luego se crea una clase "Empleado" que hereda las propiedades de "Persona" y agrega nuevas propiedades como salario y antigüedad. Se explora la relación entre Empleado y Persona, y se muestran ejemplos de creación de objetos utilizando los constructores correspondientes. También se abordan los problemas que pueden surgir al crear objetos Empleado sin proporcionar los parámetros correctos.

Problema con la bicicleta eléctrica y la clase Empleado

Resumen de la sección: En esta sección, se aborda el problema de que una bicicleta eléctrica no puede tener marca y modelo, al igual que un objeto de la clase Empleado no puede tener nombre, edad y lugar de residencia. Se propone solucionar este problema utilizando la instrucción super dentro del constructor.

Solución utilizando la instrucción super

  • La instrucción super llama al método __init__ de la clase padre.
  • Al incluir super().__init__(nombre, edad, residencia) dentro del constructor de la clase Empleado, se ejecuta primero el método __init__ de la clase padre.
  • Los valores pasados como argumentos en super().__init__(nombre, edad, residencia) se asignan a las variables correspondientes en la clase padre.

Mejorando los valores fijos y descripción

Resumen de la sección: En esta sección, se plantea mejorar los valores fijos utilizados en el constructor de la clase Empleado y también mejorar el método descripción para mostrar información adicional sobre salario y antigüedad.

Mejorando los valores fijos

  • Se modifica el constructor de la clase Empleado para recibir además del salario y antigüedad, un nombre empleado, una edad empleado y una residencia empleado.
  • Estos nombres de parámetros son utilizados en lugar de los valores fijos anteriores al llamar al constructor de la clase padre.
  • Ahora es necesario pasar cinco argumentos al crear un objeto tipo Empleado.

Mejorando el método descripción

  • Se redefine el método descripción para que reciba un self y haga uso de la función super llamando al método de la clase padre.
  • Se agrega la impresión del salario y antigüedad utilizando los atributos correspondientes (self.salario y self.antiguedad).
  • Se agregan textos descriptivos antes de imprimir los valores.

Mejorando la descripción con salario y antigüedad

Resumen de la sección: En esta sección, se mejora aún más el método descripción para incluir información sobre el salario y antigüedad en la empresa.

Reescribiendo el método descripción

  • Se redefine el método descripción para que reciba un self.
  • Se utiliza la función super para llamar al método de la clase padre.
  • Se agrega una impresión del salario utilizando self.salario.
  • Se agrega una impresión de la antigüedad utilizando self.antiguedad.
  • Se añaden textos descriptivos antes de imprimir los valores.

Ahorro de tiempo con el uso de super

Resumen de la sección: En esta sección, se explica cómo el uso de super en la herencia nos permite ahorrar tiempo al evitar tener que repetir código innecesariamente. Se menciona que al utilizar super, no es necesario inicializar todas las variables de clase nuevamente, lo cual ahorra tiempo y hace que el programa sea más eficiente.

  • El uso de super evita tener que iniciar todas las variables de clase nuevamente.
  • En el ejemplo dado, se muestra cómo al utilizar super, no es necesario repetir la línea de código para la descripción.
  • El ahorro de tiempo con el uso de super es especialmente útil en programas más complejos con múltiples clases y herencia.

Ejemplo sencillo del uso de super

Resumen de la sección: En esta sección, se muestra un ejemplo sencillo del uso de super en un programa. Se ejecuta el programa y se comprueba que funciona correctamente. Se destaca que al utilizar super, podemos acceder a los atributos y métodos tanto de la clase padre como de la clase hija.

  • Se ejecuta el programa y se verifica su funcionamiento sin problemas.
  • Al utilizar super, podemos acceder a los atributos y métodos tanto de la clase padre como de la clase hija.
  • En este ejemplo sencillo, no hay complicaciones debido a la herencia, pero en programas más complejos puede ser útil para evitar confusiones.

Problemas con herencia y múltiples clases

Resumen de la sección: En esta sección, se menciona que en programas más complejos con múltiples clases y herencia, puede haber problemas al construir una instancia debido a la herencia. Se destaca que el principio de sustitución es importante para determinar si un objeto pertenece a una clase o a otra.

  • En programas más complejos con múltiples clases y herencia, puede ser difícil determinar si una instancia pertenece a una clase específica.
  • El principio de sustitución establece que un objeto de la subclase siempre será un objeto de la superclase.
  • Es importante utilizar el principio de sustitución para verificar si el diseño de herencia en un programa es correcto.

Principio de sustitución en herencia

Resumen de la sección: En esta sección, se explica en qué consiste el principio de sustitución en aplicar los términos en español. Se menciona que el principio de sustitución establece que un objeto de la subclase siempre será un objeto de la superclase. Se destaca que esto es útil para comprobar si un diseño de herencia en un programa está bien creado.

  • El principio de sustitución establece que un objeto de la subclase siempre será un objeto de la superclase.
  • Un empleado siempre es una persona según el principio de sustitución.
  • Este principio se utiliza para comprobar si un diseño de herencia en un programa está correctamente implementado.

Uso del método isinstance

Resumen de la sección: En esta sección, se introduce el método isinstance en Python, el cual permite verificar si un objeto es instancia de una clase determinada. Se menciona que este método es útil cuando se trabaja con programas complejos y no se tiene claridad sobre a qué clase pertenece un objeto.

  • El método isinstance permite verificar si un objeto es instancia de una clase determinada.
  • Es útil cuando se trabaja con programas complejos y no se sabe a qué clase pertenece un objeto.
  • El método isinstance devuelve True si el objeto pertenece a la clase especificada, y False si no.

Ejemplo del uso de isinstance

Resumen de la sección: En esta sección, se muestra un ejemplo del uso de la función isinstance. Se crea un objeto de tipo empleado y se utiliza isinstance para comprobar si pertenece a las clases empleado y persona. Se destaca que debido al principio de sustitución, el objeto empleado también es considerado como una persona.

  • Se crea un objeto de tipo empleado llamado "manuel".
  • Se utiliza la función isinstance para comprobar si "manuel" es instancia de las clases empleado y persona.
  • Debido al principio de sustitución, "manuel" es considerado tanto empleado como persona según los resultados obtenidos con isinstance.

Verificación del principio de sustitución

Resumen de la sección: En esta sección, se verifica nuevamente el principio de sustitución utilizando la función isinstance. Se comprueba que el objeto "manuel" es instancia tanto de la clase empleado como de la clase persona. Luego, se cambia el tipo del objeto "manuel" a persona y se comprueba que ya no es instancia de la clase empleado.

  • Se verifica nuevamente el principio de sustitución utilizando la función isinstance.
  • El objeto "manuel" es instancia tanto de la clase empleado como de la clase persona.
  • Al cambiar el tipo del objeto "manuel" a persona, ya no es instancia de la clase empleado según los resultados obtenidos con isinstance.

Uso de super en un ejemplo práctico

Resumen de la sección: En esta sección, se plantea un ejemplo práctico donde se desea agregar atributos marca y modelo a una bicicleta eléctrica utilizando herencia. Se menciona que para lograr esto, se debe utilizar super en el constructor de la clase hija para llamar al constructor de la clase padre y pasarle los atributos adicionales.

  • Se plantea un ejemplo práctico donde se desea agregar atributos marca y modelo a una bicicleta eléctrica.
  • Para lograr esto, se utiliza super en el constructor de la clase hija para llamar al constructor de la clase padre.
  • Los atributos adicionales (marca y modelo) son pasados al constructor de la clase padre mediante el uso de super.

Cambios en la Clase Vehículos

Resumen de la sección: En esta parte del video, se realizan cambios en el programa para corregir errores y completar la descripción. La marca viaja desde el constructor de la clase padre (Vehículos) al constructor de la clase hija.

Actualizaciones en el Programa

  • Se ejecuta el programa sin errores.
  • No se muestra la descripción porque aún no ha sido completada.
  • La marca viaja al constructor de la clase padre (Vehículos).
  • El modelo se inicializa correctamente en el constructor de la clase padre.
Video description

Vemos en este término el uso de las funciones super() y isinstance(). Para más cursos, ejercicios y manuales visita: https://www.pildorasinformaticas.es