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

  1. Superclase (Clase Base): La clase de la cual se heredan atributos y métodos.
  2. Subclase (Clase Derivada): La clase que hereda atributos y métodos de la superclase.
  3. Herencia Simple: Una subclase hereda de una única superclase.
  4. 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

  1. Superclase Animal:

    • Tiene un método __init__ que inicializa el atributo nombre.
    • Tiene un método hacer_sonido que devuelve "Sonido de animal".
  2. Subclase Perro:

    • Hereda de Animal (indicado por class Perro(Animal)).
    • Sobrescribe el método hacer_sonido para devolver "Guau".
  3. Instancia mi_perro:

    • Se crea una instancia de Perro llamada mi_perro.
    • mi_perro tiene acceso al atributo nombre y al método sobrescrito hacer_sonido.

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

  1. Superclases Mamifero y Volador:

    • Mamifero tiene un método amamantar.
    • Volador tiene un método volar.
  2. Subclase Murcielago:

    • Hereda de Mamifero y Volador.
    • No necesita definir nuevos métodos, ya que hereda amamantar y volar.
  3. Instancia mi_murcielago:

    • Se crea una instancia de Murcielago llamada mi_murcielago.
    • mi_murcielago tiene acceso a los métodos amamantar y volar.

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

Módulo 2: Estructuras de Control

Módulo 3: Funciones y Módulos

Módulo 4: Estructuras de Datos

Módulo 5: Programación Orientada a Objetos

Módulo 6: Manejo de Archivos

Módulo 7: Manejo de Errores y Excepciones

Módulo 8: Temas Avanzados

Módulo 9: Pruebas y Depuración

Módulo 10: Desarrollo Web con Python

Módulo 11: Ciencia de Datos con Python

Módulo 12: Proyecto Final

© Copyright 2024. Todos los derechos reservados