OBJECT-ORIENTED LIBRARY SYSTEM

Objective:
Design an object-oriented library system that models books and a library using classes, attributes, methods, inheritance, and polymorphism. The program supports adding, listing, and searching books, demonstrates method overriding in subclasses, and highlights a common OOP pitfall (missing self).

How it works:

  1. Define the base class: Create Libro with attributes (titulo, autor, genero, año) and a mostrar_informacion() method to print a formatted summary.

  2. Instantiate examples: Build sample objects (libro1, libro2) and call mostrar_informacion() to verify the base class works.

  3. Extend with inheritance: Implement LibroDigital(Libro) and LibroFisico(Libro) adding specific attributes (formato, paginas) while reusing the parent constructor via super().

  4. Override polymorphically: Redefine mostrar_informacion() in both subclasses to first call the parent method and then append their subclass-specific details.

  5. Show a common error: Include LibroSinSelf to illustrate why instance methods must declare self—omitting it leads to incorrect attribute binding.

  6. Build the library manager: Implement Biblioteca with an internal list libros and methods to agregar_libro, eliminar_libro, buscar_libro (case-insensitive), and mostrar_libros.

  7. Operate the system: Create mi_biblioteca, add multiple Libro, LibroDigital, and LibroFisico instances, list all books, and run searches that demonstrate both a successful lookup and a not-found case.


# Paso 1: Introducción a POO: clases, atributos, métodos, __init__ y self  
  
class Libro:  
    def __init__(self, titulo, autor, genero, año):   
        self.titulo = titulo  
        self.autor = autor  
        self.genero = genero  
        self.año = año  
  
    # Método para mostrar información del libro  
    def mostrar_informacion(self):  
        print(f"Título: {self.titulo}, Autor: {self.autor}, Género: {self.genero}, Año: {self.año}")  
  
libro1 = Libro("Cien años de soledad", "Gabriel García Márquez", "Realismo mágico", 1967)   
libro2 = Libro("1984", "George Orwell", "Distopía", 1949)  
  
# Mostrar información de los libros  
libro1.mostrar_informacion()  
libro2.mostrar_informacion()  
  
# Subclase con herencia para libros digitales  
class LibroDigital(Libro):   
    def __init__(self, titulo, autor, genero, año, formato):  
        super().__init__(titulo, autor, genero, año)   
        self.formato = formato  # Nuevo atributo exclusivo de libros digitales  
  
    # Sobrescribir método con polimorfismo   
    def mostrar_informacion(self):  
        super().mostrar_informacion()    
        print(f"Formato: {self.formato}")  
  
# Subclase para libros físicos  
class LibroFisico(Libro):  
    def __init__(self, titulo, autor, genero, año, paginas):  
        super().__init__(titulo, autor, genero, año)  
        self.paginas = paginas  # Nuevo atributo exclusivo de libros físicos  
  
    def mostrar_informacion(self):  
        super().mostrar_informacion()    
        print(f"Páginas: {self.paginas}")  
  
# Crear instancias de libros digitales y físicos  
libro_digital1 = LibroDigital("El código Da Vinci", "Dan Brown", "Suspenso", 2003, "PDF")  
libro_fisico1 = LibroFisico("El señor de los anillos", "J.R.R. Tolkien", "Fantasía", 1954, 1178)  
  
# Ejemplo de método sin self (error)  
class LibroSinSelf:  
    def __init__(titulo, autor):  # Error: falta self  
        titulo.titulo = titulo  
        titulo.autor = autor  
  
# Paso 2: Añadimos la clase Biblioteca  
class Biblioteca:  
    def __init__(self):  
        self.libros = []  
  
    def agregar_libro(self, libro):  
        self.libros.append(libro)  
        print(f"Libro '{libro.titulo}' agregado a la biblioteca.")   
      
    def eliminar_libro(self, libro):   
        if libro in self.libros:   
            self.libros.remove(libro)  
            print(f"Libro '{libro.titulo}' eliminado de la biblioteca.")  
        else:  
            print("El libro no está en la biblioteca.")  
  
    def buscar_libro(self, titulo):  
        for libro in self.libros:  
            if libro.titulo.lower() == titulo.lower():  
                print("Libro encontrado:")  
                libro.mostrar_informacion()  
                return   
        print(f"El libro '{titulo}' no se encuentra en la biblioteca.")   
  
    def mostrar_libros(self):  
        if not self.libros:  
            print("La biblioteca está vacía.")  
        else:  
            print("Libros en la biblioteca:")  
            for libro in self.libros:  
                libro.mostrar_informacion()   
  
# Crear una instancia de Biblioteca  
mi_biblioteca = Biblioteca()  
  
# Agregar libros  
mi_biblioteca.agregar_libro(libro1)   
mi_biblioteca.agregar_libro(libro2)   
mi_biblioteca.agregar_libro(libro_digital1)  
mi_biblioteca.agregar_libro(libro_fisico1)  
  
# Mostrar todos los libros  
mi_biblioteca.mostrar_libros()  
  
# Buscar un libro  
mi_biblioteca.buscar_libro("cien años de soledad")   
mi_biblioteca.buscar_libro("ecatombe")  
Scroll al inicio