Système d'emprunt
Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 57 sur 64.
Défi
MoyenDans ce défi, vous allez implémenter un système de gestion de bibliothèque avec une fonctionnalité d'emprunt.
Implémentez la fonctionnalité requise dans les fichiers suivants :
book.py- Contient la définition de la classe Bookuser.py- Contient la définition de la classe Userlibrary.py- Contient la classe Library où vous implémenterez la méthodeborrow_book
Suivez les commentaires TODO dans chaque fichier pour un guidage d'implémentation étape par étape. La méthode borrow_book doit gérer divers scénarios, notamment le cas où le livre ou l'utilisateur n'est pas trouvé, ainsi que les vérifications de disponibilité.
Aide-mémoire
Ce défi se concentre sur la mise en œuvre d'un système de gestion de bibliothèque utilisant les principes de la programmation orientée objet. Le système comprend trois classes principales :
- Classe Book - Représente les livres individuels dans la bibliothèque
- Classe User - Représente les utilisateurs de la bibliothèque qui peuvent emprunter des livres
- Classe Library - Gère la collection de livres et s'occupe des opérations d'emprunt
La fonctionnalité clé consiste à implémenter une méthode borrow_book qui gère :
- La vérification de l'existence des livres et des utilisateurs dans le système
- La vérification de la disponibilité des livres avant le prêt
- La gestion du processus d'emprunt entre les utilisateurs et les livres
Essayez vous-même
from book import Book
from user import User
from library import Library
import random
# Gestionnaire de cas de test complet
test_case = input()
# Tests de fonctionnalités de base
if test_case == "borrow_success":
library = Library("Community Library")
# Ajouter des livres et des utilisateurs
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Emprunter un livre
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")
# Ajouter des livres et des utilisateurs
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book.available = False # Le livre est déjà emprunté
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Essayer d'emprunter un livre non disponible
result = library.borrow_book("123456", "U001")
print(result)
# Cas limites et tests supplémentaires
elif test_case == "multiple_books":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# Créer plusieurs livres
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)
# Emprunter plusieurs livres
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)
# Créer plusieurs utilisateurs
users = [
User("U001", "Alice"),
User("U002", "Bob"),
User("U003", "Charlie")
]
for user in users:
library.add_user(user)
# Essayer d'emprunter le même livre avec différents utilisateurs
result1 = library.borrow_book("999", "U001")
result2 = library.borrow_book("999", "U002") # Devrait échouer
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)
# Emprunter le livre
borrow_result = library.borrow_book("123456", "U001")
print(borrow_result)
# Vérifier le statut du livre
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")
# Créer et ajouter 100 livres
for i in range(1, 101):
book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
library.add_book(book)
# Créer et ajouter 50 utilisateurs
for i in range(1, 51):
user = User(f"U{i:03d}", f"User {i}")
library.add_user(user)
# Effectuer 200 opérations d'emprunt
successful = 0
book_not_found = 0
user_not_found = 0
not_available = 0
for _ in range(200):
# Générer des ISBN et des IDs utilisateur aléatoires (certains valides, d'autres non)
isbn = f"ISBN-{random.randint(1, 120)}" # Certains seront invalides
user_id = f"U{random.randint(1, 60):03d}" # Certains seront invalides
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)
# Emprunter le livre
library.borrow_book("123456", "U001")
# Vérifier les références
print(f"Book's borrower name: {book.borrower.name}")
print(f"First book in user's borrowed list: {user.books_borrowed[0].title}")Toutes les leçons de Object Oriented Programming
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Membres Publics, Protégés, PrivésModificateurs d'accèsMasquage d'informationsDécorateurs Property AvancésRécapitulatif - Système de Gestion d'Étudiants12Projet : Gestion de bibliothèque
Présentation du projetClasses Livre et Utilisateur