Resumen

Domina la herencia en Python con un ejemplo claro y útil: un sistema de usuarios que evita duplicar código entre estudiantes y profesores. Aprenderás a usar la clase base, la herencia simple, el método constructor, la sobrescritura de métodos y una validación práctica de límite de libros. Todo con mensajes de retorno consistentes y listas para registrar préstamos.

¿Qué resuelve la herencia simple en Python?

La herencia simple permite que una clase hija copie funcionalidades y atributos de una clase padre. Aquí, Usuario es la base que comparten Estudiante y Profesor, lo que evita reescribir atributos comunes como nombre y cédula y métodos como solicitar libro.

  • Reduce duplicación de código y errores.
  • Centraliza atributos y comportamientos comunes.
  • Facilita extender con nuevos atributos específicos.
  • Mantiene mensajes de retorno consistentes.

¿Cómo se implementan usuario, estudiante y profesor con super?

Partimos del archivo usuarios.py y definimos la clase base con los atributos comunes. Las clases hijas heredan colocando el nombre de la clase padre entre paréntesis. El uso de super en el constructor (init) llama al init de la clase padre sin nombrarla directamente, evitando confusiones y acoplamientos innecesarios.

¿Cómo definir atributos comunes y lista de libros prestados?

En Usuario centralizamos nombre, cédula y una lista compartida para registrar préstamos. Así resolvemos el posible bug de duplicar la lista en hijas.

class Usuario:
    def __init__(self, nombre, cedula):
        self.nombre = nombre
        self.cedula = cedula
        self.libros_prestados = []

    def solicitar_libro(self, titulo):
        return f"Solicitud de libro '{titulo}' realizada."

¿Cómo agregar carrera y límite de libros al estudiante?

Estudiante hereda de Usuario, añade la carrera y define un límite de libros de 3 por defecto.

class Estudiante(Usuario):
    def __init__(self, nombre, cedula, carrera):
        super().__init__(nombre, cedula)
        self.carrera = carrera
        self.limite_libros = 3

¿Qué cambia en el profesor y por qué límite es None?

Profesor también hereda de Usuario, pero su límite no aplica: se usa None para indicar que no hay restricción.

class Profesor(Usuario):
    def __init__(self, nombre, cedula):
        super().__init__(nombre, cedula)
        self.limite_libros = None

¿Cómo funciona solicitar libro y la sobrescritura con validación?

Definimos un método base que retorna un mensaje simple y lo sobrescribimos en las clases hijas. En Estudiante, se valida con len de la lista si aún puede prestar; si sí, se agrega con append y se retorna un mensaje de préstamo autorizado. Si alcanzó el límite, retorna un texto de límite alcanzado. En Profesor, no hay validación: se agrega y se confirma el préstamo.

class Usuario:
    # ... (mismo __init__)
    def solicitar_libro(self, titulo):
        return f"Solicitud de libro '{titulo}' realizada."

class Estudiante(Usuario):
    # ... (mismo __init__)
    def solicitar_libro(self, titulo):
        if len(self.libros_prestados) < self.limite_libros:
            self.libros_prestados.append(titulo)
            return f"Préstamo del libro '{titulo}' autorizado."
        else:
            return f"No puedes prestar más libros. Límite alcanzado: {self.limite_libros}."

class Profesor(Usuario):
    # ... (mismo __init__)
    def solicitar_libro(self, titulo):
        self.libros_prestados.append(titulo)
        return f"Préstamo del libro '{titulo}' autorizado."
  • Usuario retorna confirmación simple de solicitud.
  • Estudiante sobrescribe para validar el límite antes de agregar.
  • Profesor sobrescribe para agregar sin límite.
  • Mensajes consistentes facilitan pruebas con print y lectura en terminal.

¿Cómo probar la lógica con instancias y print?

Creamos un estudiante y un profesor, luego pedimos cuatro libros para comprobar límites y mensajes.

# Instanciar objetos
estudiante = Estudiante("Luis", "123456", "Ingeniería")
profesor = Profesor("Ana", "987654")

# Pruebas de préstamo
print(estudiante.solicitar_libro("Python básico"))
print(estudiante.solicitar_libro("Python intermedio"))
print(estudiante.solicitar_libro("Python avanzado"))
print(estudiante.solicitar_libro("Python Django"))  # Debe indicar límite alcanzado: 3

print(profesor.solicitar_libro("Python básico"))
print(profesor.solicitar_libro("Python intermedio"))
print(profesor.solicitar_libro("Python avanzado"))
print(profesor.solicitar_libro("Python Django"))    # Todos autorizados

¿Te gustaría extender la funcionalidad? Crea y comenta un método para que un estudiante pueda devolver un libro y que la lista quede actualizada. ¿Cómo gestionarías el caso en que intente devolver un libro que no tiene?.