Интерфейс администратора
Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 59 из 64.
Задание
СреднеВ этом задании тебе предстоит реализовать административные функции системы управления библиотекой.
Тебе нужно изменить файл library.py, добавив в класс Library метод get_statistics, который возвращает словарь с ключевыми показателями состояния библиотеки. Подробности реализации указаны в комментариях TODO в файле.
Статистика должна включать:
- Общее количество книг
- Количество доступных книг
- Количество взятых книг
- Общее количество пользователей
- Количество пользователей, взявших книги
Файлы book.py и user.py содержат уже реализованные классы, с которыми будет взаимодействовать твоё решение. Ты можешь изучить эти файлы, чтобы понять структуру системы, однако сосредоточься на реализации в файле library.py.
Попробуйте сами
from book import Book
from user import User
from library import Library
# Обработка тестового случая
test_case = input()
if test_case == "empty_library":
library = Library("Empty Library")
stats = library.get_statistics()
print(f"Total Books: {stats['total_books']}")
print(f"Available Books: {stats['available_books']}")
print(f"Borrowed Books: {stats['borrowed_books']}")
print(f"Total Users: {stats['total_users']}")
print(f"Users with Books: {stats['users_with_books']}")
elif test_case == "with_borrowed_books":
library = Library("Community Library")
# Добавить книги и пользователей
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
library.add_book(Book("1984", "George Orwell", "345678"))
library.add_user(User("U001", "Alice"))
library.add_user(User("U002", "Bob"))
library.add_user(User("U003", "Charlie"))
# Взять несколько книг
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U001") # Alice берёт 2 книги
library.borrow_book("345678", "U002") # Bob берёт 1 книгу
stats = library.get_statistics()
print(f"Total Books: {stats['total_books']}")
print(f"Available Books: {stats['available_books']}")
print(f"Borrowed Books: {stats['borrowed_books']}")
print(f"Total Users: {stats['total_users']}")
print(f"Users with Books: {stats['users_with_books']}")
elif test_case == "return_books":
library = Library("Return Test Library")
# Добавить книги и пользователей
library.add_book(Book("Python Programming", "John Smith", "111222"))
library.add_book(Book("Data Structures", "Jane Doe", "333444"))
library.add_user(User("U101", "David"))
library.add_user(User("U102", "Emma"))
# Взять книгу
library.borrow_book("111222", "U101")
# Получить статистику до возврата книги
stats_before = library.get_statistics()
print("Before returning:")
print(f"Total Books: {stats_before['total_books']}")
print(f"Available Books: {stats_before['available_books']}")
print(f"Borrowed Books: {stats_before['borrowed_books']}")
print(f"Users with Books: {stats_before['users_with_books']}")
# Реализация возврата книги (должна находиться в классе Library)
book = next((book for book in library.books if book.isbn == "111222"), None)
user = next((user for user in library.users if user.user_id == "U101"), None)
if book and user:
book.available = True
book.borrower = None
user.books_borrowed.remove(book)
print("Book returned successfully")
# Получить статистику после возврата книги
stats_after = library.get_statistics()
print("\
After returning:")
print(f"Total Books: {stats_after['total_books']}")
print(f"Available Books: {stats_after['available_books']}")
print(f"Borrowed Books: {stats_after['borrowed_books']}")
print(f"Users with Books: {stats_after['users_with_books']}")
elif test_case == "edge_cases":
# Пустая библиотека
empty_library = Library("Empty Library")
empty_stats = empty_library.get_statistics()
print("Empty library statistics:")
print(f"Total Books: {empty_stats['total_books']}")
print(f"Available Books: {empty_stats['available_books']}")
print(f"Borrowed Books: {empty_stats['borrowed_books']}")
print(f"Total Users: {empty_stats['total_users']}")
print(f"Users with Books: {empty_stats['users_with_books']}")
# Книги есть, но пользователей нет
books_only = Library("Books Only")
books_only.add_book(Book("Book 1", "Author 1", "B001"))
books_only.add_book(Book("Book 2", "Author 2", "B002"))
books_stats = books_only.get_statistics()
print("\
Library with books but no users:")
print(f"Total Books: {books_stats['total_books']}")
print(f"Available Books: {books_stats['available_books']}")
print(f"Total Users: {books_stats['total_users']}")
print(f"Users with Books: {books_stats['users_with_books']}")
# Пользователи есть, но книг нет
users_only = Library("Users Only")
users_only.add_user(User("U201", "User 1"))
users_only.add_user(User("U202", "User 2"))
users_stats = users_only.get_statistics()
print("\
Library with users but no books:")
print(f"Total Books: {users_stats['total_books']}")
print(f"Available Books: {users_stats['available_books']}")
print(f"Total Users: {users_stats['total_users']}")
print(f"Users with Books: {users_stats['users_with_books']}")
# Случаи ошибок
error_library = Library("Error Test")
error_library.add_book(Book("Error Book", "Error Author", "E001"))
error_library.add_user(User("E101", "Error User"))
print("\
Error cases:")
print(f"Borrow non-existent book: {error_library.borrow_book('NONEXISTENT', 'E101')}")
print(f"Borrow with non-existent user: {error_library.borrow_book('E001', 'NONEXISTENT')}")
elif test_case == "large_library":
large_library = Library("Large Library")
# Добавить 100 книг
for i in range(1, 101):
large_library.add_book(Book(f"Book {i}", f"Author {i}", f"ISBN{i:06d}"))
# Добавить 100 пользователей
for i in range(1, 101):
large_library.add_user(User(f"U{i:03d}", f"User {i}"))
# Пусть 50 пользователей возьмут книги
for i in range(1, 51):
large_library.borrow_book(f"ISBN{i:06d}", f"U{i:03d}")
# Пусть некоторые пользователи возьмут по несколько книг
for i in range(1, 11):
large_library.borrow_book(f"ISBN{i+50:06d}", f"U{i:03d}")
stats = large_library.get_statistics()
print("Large library statistics:")
print(f"Total Books: {stats['total_books']}")
print(f"Available Books: {stats['available_books']}")
print(f"Borrowed Books: {stats['borrowed_books']}")
print(f"Total Users: {stats['total_users']}")
print(f"Users with Books: {stats['users_with_books']}")
# Проверить вычисления
print("\
Verification:")
print(f"Total books should be 100: {stats['total_books'] == 100}")
print(f"Borrowed books should be 60: {stats['borrowed_books'] == 60}")
print(f"Available books should be 40: {stats['available_books'] == 40}")
print(f"Users with books should be 50: {stats['users_with_books'] == 50}")
elif test_case == "statistics_accuracy":
accuracy_library = Library("Accuracy Test")
# Добавить ровно 10 книг
for i in range(1, 11):
accuracy_library.add_book(Book(f"Book {i}", f"Author {i}", f"A{i:03d}"))
# Добавить ровно 5 пользователей
for i in range(1, 6):
accuracy_library.add_user(User(f"AU{i}", f"Accuracy User {i}"))
# Пока никто не взял книги
stats1 = accuracy_library.get_statistics()
print("Initial state:")
print(f"Total Books: {stats1['total_books']} (Expected: 10)")
print(f"Available Books: {stats1['available_books']} (Expected: 10)")
print(f"Borrowed Books: {stats1['borrowed_books']} (Expected: 0)")
print(f"Total Users: {stats1['total_users']} (Expected: 5)")
print(f"Users with Books: {stats1['users_with_books']} (Expected: 0)")
# Пусть 3 пользователя возьмут книги
accuracy_library.borrow_book("A001", "AU1")
accuracy_library.borrow_book("A002", "AU1") # Пользователь 1 берёт 2 книги
accuracy_library.borrow_book("A003", "AU2") # Пользователь 2 берёт 1 книгу
accuracy_library.borrow_book("A004", "AU3") # Пользователь 3 берёт 1 книгу
stats2 = accuracy_library.get_statistics()
print("\
After borrowing:")
print(f"Total Books: {stats2['total_books']} (Expected: 10)")
print(f"Available Books: {stats2['available_books']} (Expected: 6)")
print(f"Borrowed Books: {stats2['borrowed_books']} (Expected: 4)")
print(f"Total Users: {stats2['total_users']} (Expected: 5)")
print(f"Users with Books: {stats2['users_with_books']} (Expected: 3)")Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python