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:
Define the base class: Create
Libro
with attributes (titulo
,autor
,genero
,año
) and amostrar_informacion()
method to print a formatted summary.Instantiate examples: Build sample objects (
libro1
,libro2
) and callmostrar_informacion()
to verify the base class works.Extend with inheritance: Implement
LibroDigital(Libro)
andLibroFisico(Libro)
adding specific attributes (formato
,paginas
) while reusing the parent constructor viasuper()
.Override polymorphically: Redefine
mostrar_informacion()
in both subclasses to first call the parent method and then append their subclass-specific details.Show a common error: Include
LibroSinSelf
to illustrate why instance methods must declareself
—omitting it leads to incorrect attribute binding.Build the library manager: Implement
Biblioteca
with an internal listlibros
and methods toagregar_libro
,eliminar_libro
,buscar_libro
(case-insensitive), andmostrar_libros
.Operate the system: Create
mi_biblioteca
, add multipleLibro
,LibroDigital
, andLibroFisico
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")