Sistema de préstamos
Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 57 de 64.
Desafío
IntermedioEn este desafío, implementarás un sistema de gestión de biblioteca con funcionalidad de préstamo.
Implementa la funcionalidad requerida en los siguientes archivos:
book.py- Contiene la definición de la clase Bookuser.py- Contiene la definición de la clase Userlibrary.py- Contiene la clase Library donde implementarás el métodoborrow_book
Sigue los comentarios TODO en cada archivo para obtener una guía de implementación paso a paso. El método borrow_book debe manejar varios escenarios, incluyendo si el libro o el usuario no se encuentran y comprobaciones de disponibilidad.
Hoja de referencia
Este desafío se centra en la implementación de un sistema de gestión de bibliotecas utilizando principios de programación orientada a objetos. El sistema involucra tres clases principales:
- Clase Book - Representa libros individuales en la biblioteca
- Clase User - Representa a los usuarios de la biblioteca que pueden pedir prestados libros
- Clase Library - Gestiona la colección de libros y maneja las operaciones de préstamo
La funcionalidad clave consiste en implementar un método borrow_book que maneja:
- Comprobar si los libros y los usuarios existen en el sistema
- Verificar la disponibilidad de los libros antes del préstamo
- Gestionar el proceso de préstamo entre usuarios y libros
Pruébalo tú mismo
from book import Book
from user import User
from library import Library
import random
# Manejador integral de casos de prueba
test_case = input()
# Pruebas de funcionalidad básica
if test_case == "borrow_success":
library = Library("Community Library")
# Agregar libros y usuarios
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Tomar prestado libro
result = library.borrow_book("123456", "U001")
print(result)
print(f"Book available: {book.available}")
print(f"Books borrowed by user: {len(user.books_borrowed)}")
elif test_case == "book_not_found":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
result = library.borrow_book("nonexistent", "U001")
print(result)
elif test_case == "user_not_found":
library = Library("Community Library")
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
result = library.borrow_book("123456", "nonexistent")
print(result)
elif test_case == "book_not_available":
library = Library("Community Library")
# Agregar libros y usuarios
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book.available = False # El libro ya está prestado
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Intentar tomar prestado un libro no disponible
result = library.borrow_book("123456", "U001")
print(result)
# Casos de borde y pruebas adicionales
elif test_case == "multiple_books":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# Crear múltiples libros
books = [
Book("Book 1", "Author 1", "111"),
Book("Book 2", "Author 2", "222"),
Book("Book 3", "Author 3", "333")
]
for book in books:
library.add_book(book)
# Tomar prestados múltiples libros
results = []
for book in books:
results.append(library.borrow_book(book.isbn, "U001"))
for result in results:
print(result)
print(f"Total books borrowed: {len(user.books_borrowed)}")
elif test_case == "multiple_users":
library = Library("Community Library")
book = Book("Popular Book", "Famous Author", "999")
library.add_book(book)
# Crear múltiples usuarios
users = [
User("U001", "Alice"),
User("U002", "Bob"),
User("U003", "Charlie")
]
for user in users:
library.add_user(user)
# Intentar tomar prestado el mismo libro con diferentes usuarios
result1 = library.borrow_book("999", "U001")
result2 = library.borrow_book("999", "U002") # Debería fallar
print(result1)
print(result2)
print(f"Book's borrower: {book.borrower.name}")
elif test_case == "return_book":
library = Library("Community Library")
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Tomar prestado el libro
borrow_result = library.borrow_book("123456", "U001")
print(borrow_result)
# Verificar el estado del libro
print(f"Book available: {book.available}")
print(f"Book borrower: {book.borrower.name}")
print(f"User's borrowed books: {len(user.books_borrowed)}")
print(f"First borrowed book title: {user.books_borrowed[0].title}")
elif test_case == "empty_library":
library = Library("Empty Library")
result = library.borrow_book("any_isbn", "any_user_id")
print(result)
elif test_case == "stress_test":
library = Library("Large Library")
# Crear y agregar 100 libros
for i in range(1, 101):
book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
library.add_book(book)
# Crear y agregar 50 usuarios
for i in range(1, 51):
user = User(f"U{i:03d}", f"User {i}")
library.add_user(user)
# Realizar 200 operaciones de préstamo
successful = 0
book_not_found = 0
user_not_found = 0
not_available = 0
for _ in range(200):
# Generar ISBNs e IDs de usuario aleatorios (algunos válidos, otros inválidos)
isbn = f"ISBN-{random.randint(1, 120)}" # Algunos serán inválidos
user_id = f"U{random.randint(1, 60):03d}" # Algunos serán inválidos
result = library.borrow_book(isbn, user_id)
if result == "Book borrowed successfully":
successful += 1
elif result == "Book not found":
book_not_found += 1
elif result == "User not found":
user_not_found += 1
elif result == "Book is not available":
not_available += 1
print(f"Successful borrows: {successful}")
print(f"Book not found: {book_not_found}")
print(f"User not found: {user_not_found}")
print(f"Book not available: {not_available}")
elif test_case == "borrower_reference":
library = Library("Community Library")
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Tomar prestado el libro
library.borrow_book("123456", "U001")
# Verificar referencias
print(f"Book's borrower name: {book.borrower.name}")
print(f"First book in user's borrowed list: {user.books_borrowed[0].title}")Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias6Encapsulamiento
Miembros públicos, protegidos y privadosModificadores de accesoOcultamiento de informaciónDecoradores de propiedades avanzadosResumen - Sistema de registros de estudiantes12Proyecto: Gestión de biblioteca
Descripción general del proyectoClases de Libros y Usuarios