La herencia es uno de los pilares fundamentales de la Programación Orientada a Objetos (POO). Permite que una clase (llamada subclase o clase derivada) herede atributos y métodos de otra clase (llamada superclase o clase base). Esto facilita la reutilización del código y la creación de estructuras jerárquicas.
Conceptos Clave
- Superclase (Clase Base): La clase de la cual se heredan atributos y métodos.
- Subclase (Clase Derivada): La clase que hereda atributos y métodos de la superclase.
- Herencia Simple: Una subclase hereda de una única superclase.
- Herencia Múltiple: Una subclase hereda de más de una superclase (Python soporta herencia múltiple).
Ejemplo Básico de Herencia
Vamos a crear una superclase Animal
y una subclase Perro
que hereda de Animal
.
# Definición de la superclase class Animal: def __init__(self, nombre): self.nombre = nombre def hacer_sonido(self): return "Sonido de animal" # Definición de la subclase class Perro(Animal): def hacer_sonido(self): return "Guau" # Crear una instancia de Perro mi_perro = Perro("Firulais") print(mi_perro.nombre) # Salida: Firulais print(mi_perro.hacer_sonido()) # Salida: Guau
Explicación del Código
-
Superclase
Animal
:- Tiene un método
__init__
que inicializa el atributonombre
. - Tiene un método
hacer_sonido
que devuelve "Sonido de animal".
- Tiene un método
-
Subclase
Perro
:- Hereda de
Animal
(indicado porclass Perro(Animal)
). - Sobrescribe el método
hacer_sonido
para devolver "Guau".
- Hereda de
-
Instancia
mi_perro
:- Se crea una instancia de
Perro
llamadami_perro
. mi_perro
tiene acceso al atributonombre
y al método sobrescritohacer_sonido
.
- Se crea una instancia de
Herencia Múltiple
Python permite que una clase herede de múltiples superclases. Esto se hace listando las superclases entre paréntesis separados por comas.
class Mamifero: def __init__(self, nombre): self.nombre = nombre def amamantar(self): return "Amamantando" class Volador: def volar(self): return "Volando" class Murcielago(Mamifero, Volador): pass # Crear una instancia de Murcielago mi_murcielago = Murcielago("Bruce") print(mi_murcielago.nombre) # Salida: Bruce print(mi_murcielago.amamantar()) # Salida: Amamantando print(mi_murcielago.volar()) # Salida: Volando
Explicación del Código
-
Superclases
Mamifero
yVolador
:Mamifero
tiene un métodoamamantar
.Volador
tiene un métodovolar
.
-
Subclase
Murcielago
:- Hereda de
Mamifero
yVolador
. - No necesita definir nuevos métodos, ya que hereda
amamantar
yvolar
.
- Hereda de
-
Instancia
mi_murcielago
:- Se crea una instancia de
Murcielago
llamadami_murcielago
. mi_murcielago
tiene acceso a los métodosamamantar
yvolar
.
- Se crea una instancia de
Ejercicio Práctico
Ejercicio 1
Crea una superclase Vehiculo
con los atributos marca
y modelo
, y un método arrancar
. Luego, crea una subclase Coche
que herede de Vehiculo
y añada un atributo puertas
. Sobrescribe el método arrancar
para que incluya la información del número de puertas.
Solución
class Vehiculo: def __init__(self, marca, modelo): self.marca = marca self.modelo = modelo def arrancar(self): return f"El {self.marca} {self.modelo} está arrancando" class Coche(Vehiculo): def __init__(self, marca, modelo, puertas): super().__init__(marca, modelo) self.puertas = puertas def arrancar(self): return f"El {self.marca} {self.modelo} con {self.puertas} puertas está arrancando" # Crear una instancia de Coche mi_coche = Coche("Toyota", "Corolla", 4) print(mi_coche.arrancar()) # Salida: El Toyota Corolla con 4 puertas está arrancando
Ejercicio 2
Crea una superclase Persona
con los atributos nombre
y edad
, y un método presentarse
. Luego, crea una subclase Estudiante
que herede de Persona
y añada un atributo carrera
. Sobrescribe el método presentarse
para que incluya la información de la carrera.
Solución
class Persona: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad def presentarse(self): return f"Hola, soy {self.nombre} y tengo {self.edad} años" class Estudiante(Persona): def __init__(self, nombre, edad, carrera): super().__init__(nombre, edad) self.carrera = carrera def presentarse(self): return f"Hola, soy {self.nombre}, tengo {self.edad} años y estudio {self.carrera}" # Crear una instancia de Estudiante mi_estudiante = Estudiante("Ana", 21, "Ingeniería Informática") print(mi_estudiante.presentarse()) # Salida: Hola, soy Ana, tengo 21 años y estudio Ingeniería Informática
Resumen
En esta lección, hemos aprendido sobre la herencia en Python, incluyendo:
- La definición de superclases y subclases.
- Cómo sobrescribir métodos en subclases.
- La herencia múltiple y su implementación en Python.
La herencia es una herramienta poderosa que permite la reutilización del código y la creación de jerarquías de clases, facilitando el diseño y mantenimiento de aplicaciones complejas. En la próxima lección, exploraremos el polimorfismo y cómo se puede utilizar para escribir código más flexible y reutilizable.
Curso de Programación en Python
Módulo 1: Introducción a Python
- Introducción a Python
- Configuración del Entorno de Desarrollo
- Sintaxis de Python y Tipos de Datos Básicos
- Variables y Constantes
- Entrada y Salida Básica
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for y while
- Herramientas de Control de Flujo
- Comprensiones de Listas
Módulo 3: Funciones y Módulos
- Definición de Funciones
- Argumentos de Función
- Funciones Lambda
- Módulos y Paquetes
- Visión General de la Biblioteca Estándar
Módulo 4: Estructuras de Datos
Módulo 5: Programación Orientada a Objetos
Módulo 6: Manejo de Archivos
- Lectura y Escritura de Archivos
- Trabajo con Archivos CSV
- Manejo de Datos JSON
- Operaciones de Archivos y Directorios
Módulo 7: Manejo de Errores y Excepciones
- Introducción a las Excepciones
- Manejo de Excepciones
- Lanzamiento de Excepciones
- Excepciones Personalizadas
Módulo 8: Temas Avanzados
- Decoradores
- Generadores
- Administradores de Contexto
- Concurrencia: Hilos y Procesos
- Asyncio para Programación Asíncrona
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con unittest
- Desarrollo Guiado por Pruebas
- Técnicas de Depuración
- Uso de pdb para Depuración
Módulo 10: Desarrollo Web con Python
- Introducción al Desarrollo Web
- Fundamentos del Framework Flask
- Construcción de APIs REST con Flask
- Introducción a Django
- Construcción de Aplicaciones Web con Django
Módulo 11: Ciencia de Datos con Python
- Introducción a la Ciencia de Datos
- NumPy para Computación Numérica
- Pandas para Manipulación de Datos
- Matplotlib para Visualización de Datos
- Introducción al Aprendizaje Automático con scikit-learn