Система выдачи книг
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 57 из 64.
Задание
СреднеВ этом испытании вы реализуете систему управления библиотекой с функциональностью выдачи книг.
Реализуйте необходимую функциональность в следующих файлах:
book.py— содержит определение класса Bookuser.py— содержит определение класса Userlibrary.py— содержит класс Library, в котором вы реализуете методborrow_book
Следуйте комментариям TODO в каждом файле для пошагового руководства по реализации. Метод borrow_book должен обрабатывать различные сценарии, включая отсутствие книги/пользователя и проверку доступности.
Шпаргалка
Этот челлендж посвящен реализации системы управления библиотекой с использованием принципов объектно-ориентированного программирования. Система включает в себя три основных класса:
- Book class — представляет отдельные книги в библиотеке
- User class — представляет пользователей библиотеки, которые могут брать книги
- Library class — управляет коллекцией книг и обрабатывает операции по выдаче книг
Ключевая функциональность включает реализацию метода borrow_book, который обрабатывает:
- Проверку существования книг и пользователей в системе
- Проверку доступности книги перед выдачей
- Управление процессом заимствования между пользователями и книгами
Попробуйте сами
from book import Book
from user import User
from library import Library
import random
# Обработчик комплексных тестовых случаев
test_case = input()
# Тесты базовой функциональности
if test_case == "borrow_success":
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)
# Взять книгу
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")
# Добавление книг и пользователей
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book.available = False # Книга уже выдана
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Попытка взять недоступную книгу
result = library.borrow_book("123456", "U001")
print(result)
# Граничные случаи и дополнительные тесты
elif test_case == "multiple_books":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# Создание нескольких книг
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)
# Взять несколько книг
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)
# Создание нескольких пользователей
users = [
User("U001", "Alice"),
User("U002", "Bob"),
User("U003", "Charlie")
]
for user in users:
library.add_user(user)
# Попытка взять одну и ту же книгу разными пользователями
result1 = library.borrow_book("999", "U001")
result2 = library.borrow_book("999", "U002") # Должно завершиться ошибкой
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)
# Взять книгу
borrow_result = library.borrow_book("123456", "U001")
print(borrow_result)
# Проверка статуса книги
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")
# Создание и добавление 100 книг
for i in range(1, 101):
book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
library.add_book(book)
# Создание и добавление 50 пользователей
for i in range(1, 51):
user = User(f"U{i:03d}", f"User {i}")
library.add_user(user)
# Выполнение 200 операций заимствования
successful = 0
book_not_found = 0
user_not_found = 0
not_available = 0
for _ in range(200):
# Генерация случайных ISBN и ID пользователей (некоторые валидные, некоторые нет)
isbn = f"ISBN-{random.randint(1, 120)}" # Некоторые будут невалидными
user_id = f"U{random.randint(1, 60):03d}" # Некоторые будут невалидными
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)
# Взять книгу
library.borrow_book("123456", "U001")
# Проверка ссылок
print(f"Book's borrower name: {book.borrower.name}")
print(f"First book in user's borrowed list: {user.books_borrowed[0].title}")Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User