대출 시스템
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 57번째.
챌린지
중급이 챌린지에서는 대출 기능이 포함된 도서관 관리 시스템을 구현합니다.
다음 파일들에 필요한 기능을 구현하세요:
book.py-Book클래스 정의를 포함합니다user.py-User클래스 정의를 포함합니다library.py-borrow_book메서드를 구현할Library클래스를 포함합니다
단계별 구현 안내를 위해 각 파일의 TODO 주석을 따르세요. borrow_book 메서드는 도서/사용자를 찾을 수 없는 경우와 대출 가능 여부 확인을 포함한 다양한 시나리오를 처리해야 합니다.
치트 시트
이 챌린지는 객체 지향 프로그래밍 원칙을 사용하여 도서 관리 시스템을 구현하는 데 중점을 둡니다. 이 시스템은 세 가지 주요 클래스로 구성됩니다:
- Book 클래스 - 도서관의 개별 도서를 나타냅니다
- User 클래스 - 도서를 대출할 수 있는 도서관 사용자를 나타냅니다
- Library 클래스 - 도서 컬렉션을 관리하고 대출 작업을 처리합니다
주요 기능은 다음을 처리하는 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}")