La herencia en Python es clave para escribir código limpio y evitar duplicación en proyectos reales como un sistema de biblioteca. Con una estructura similar a un árbol genealógico, permite que clases hijas reutilicen atributos y métodos de una clase padre, manteniendo la lógica central en un solo lugar y habilitando comportamientos específicos donde haga falta.
¿Qué es la herencia en Python y por qué evita duplicación?
La herencia establece relaciones de “es un tipo de”: un Estudiante es un tipo de Usuario, igual que un Profesor. Así, las clases hijas heredan atributos y métodos del padre, y los cambios en la clase base se propagan automáticamente. Además, el override permite redefinir métodos en subclases para comportamientos distintos, habilitando polimorfismo sin romper el diseño. Todo esto promueve reutilización y mantenibilidad del código.
Clase padre con atributos y métodos comunes.
Clases hijas que heredan y especializan comportamiento.
Override para validar reglas específicas.
Polimorfismo para responder distinto con la misma interfaz.
Herencia múltiple cuando un objeto combina roles.
¿Cómo modelar usuarios con clases que heredan?
Partimos de una clase base Usuario con los datos mínimos: nombre y cédula, y un método común: solicitar_libro. Luego extendemos con Estudiante y Profesor, cada uno con validaciones particulares mediante override del método.
¿Cómo definir la clase base usuario?
Esta clase concentra lo compartido por todos los usuarios del sistema: identidad y la capacidad de solicitar libros.
classUsuario:def__init__(self, nombre, cedula): self.nombre = nombre
self.cedula = cedula
defsolicitar_libro(self, titulo):# Lógica genérica de solicitud para cualquier usuarioreturnf"Solicitud de '{titulo}' registrada para {self.nombre}."
¿Cómo extender con estudiante?
Estudiante hereda de Usuario y agrega atributos propios: libros_prestados, carrera y limite_libros. Con override de solicitar_libro se valida, por ejemplo, que la carrera esté activa y que no se exceda el límite de préstamos.
classEstudiante(Usuario):def__init__(self, nombre, cedula, libros_prestados=0, carrera=None, limite_libros=3):super().__init__(nombre, cedula) self.libros_prestados = libros_prestados
self.carrera = carrera
self.limite_libros = limite_libros
defsolicitar_libro(self, titulo):# override: validación extra para estudiantesifnot self.carrera:return"No se puede prestar: carrera inactiva o no registrada."if self.libros_prestados >= self.limite_libros:return"No se puede prestar: alcanzó el límite de libros."returnsuper().solicitar_libro(titulo)
¿Cómo especializar con profesor?
Profesor también hereda de Usuario, pero su validación es distinta: interesa el departamento y no la carrera. Se vuelve a crear el método con override para cubrir esa regla.
classProfesor(Usuario):def__init__(self, nombre, cedula, departamento=None):super().__init__(nombre, cedula) self.departamento = departamento
defsolicitar_libro(self, titulo):# override: validación para profesoresifnot self.departamento:return"No se puede prestar: departamento no asignado."returnsuper().solicitar_libro(titulo)
¿Cuándo aplicar herencia múltiple y polimorfismo en una biblioteca?
Hay casos en los que un mismo usuario combina roles, por ejemplo, Profesor y Estudiante. La herencia múltiple permite componer ambos comportamientos y, si se requiere, priorizar las funcionalidades del profesor por encima de las del estudiante.
classProfesorEstudiante(Profesor, Estudiante):pass# Se priorizan comportamientos de Profesor al declarar primero esa clase
Relación “es un tipo de” para estructurar jerarquías.
Override para validar reglas por rol sin duplicar código.
Polimorfismo para responder distinto con la misma interfaz.
Herencia múltiple cuando un usuario cumple dos roles y se requiere prioridad.
En la próxima implementación, estos conceptos se aplicarán al sistema de biblioteca. Como reto: identifica posibles jerarquías y cuéntalas en los comentarios.