Ödünç Alma Sistemi
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 57 / 64.
Görev
OrtaBu meydan okumada, ödünç alma işlevine sahip bir kütüphane yönetim sistemi uygulayacaksınız.
Gerekli işlevselliği aşağıdaki dosyalarda uygulayın:
book.py- Book sınıfı tanımını içeriruser.py- User sınıfı tanımını içerirlibrary.py-borrow_bookmetodunu uygulayacağınız Library sınıfını içerir
Adım adım uygulama rehberliği için her dosyadaki TODO yorumlarını takip edin. borrow_book metodu, kitap/kullanıcı bulunamaması ve uygunluk kontrolleri dahil olmak üzere çeşitli senaryoları ele almalıdır.
Kopya kağıdı
Bu meydan okuma, nesne yönelimli programlama prensiplerini kullanarak bir kütüphane yönetim sistemi uygulamaya odaklanmaktadır. Sistem üç ana sınıftan oluşur:
- Book sınıfı - Kütüphanedeki bireysel kitapları temsil eder
- User sınıfı - Kitap ödünç alabilen kütüphane kullanıcılarını temsil eder
- Library sınıfı - Kitap koleksiyonunu yönetir ve ödünç alma işlemlerini gerçekleştirir
Temel işlevsellik, şunları yöneten bir borrow_book metodunun uygulanmasını içerir:
- Kitapların ve kullanıcıların sistemde mevcut olup olmadığının kontrol edilmesi
- Ödünç vermeden önce kitap uygunluğunun doğrulanması
- Kullanıcılar ve kitaplar arasındaki ödünç alma sürecinin yönetilmesi
Kendin dene
from book import Book
from user import User
from library import Library
import random
# Kapsamlı test durumu işleyicisi
test_case = input()
# Temel işlevsellik testleri
if test_case == "borrow_success":
library = Library("Community Library")
# Kitapları ve kullanıcıları ekle
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Kitap ödünç al
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")
# Kitapları ve kullanıcıları ekle
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book.available = False # Kitap zaten ödünç alınmış
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Mevcut olmayan kitabı ödünç almayı dene
result = library.borrow_book("123456", "U001")
print(result)
# Uç durumlar ve ek testler
elif test_case == "multiple_books":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# Birden fazla kitap oluştur
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)
# Birden fazla kitap ödünç al
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)
# Birden fazla kullanıcı oluştur
users = [
User("U001", "Alice"),
User("U002", "Bob"),
User("U003", "Charlie")
]
for user in users:
library.add_user(user)
# Aynı kitabı farklı kullanıcılarla ödünç almayı dene
result1 = library.borrow_book("999", "U001")
result2 = library.borrow_book("999", "U002") # Başarısız olmalı
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)
# Kitabı ödünç al
borrow_result = library.borrow_book("123456", "U001")
print(borrow_result)
# Kitap durumunu doğrula
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 kitap oluştur ve ekle
for i in range(1, 101):
book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
library.add_book(book)
# 50 kullanıcı oluştur ve ekle
for i in range(1, 51):
user = User(f"U{i:03d}", f"User {i}")
library.add_user(user)
# 200 ödünç alma işlemi gerçekleştir
successful = 0
book_not_found = 0
user_not_found = 0
not_available = 0
for _ in range(200):
# Rastgele ISBN'ler ve kullanıcı kimlikleri oluştur (bazıları geçerli, bazıları geçersiz)
isbn = f"ISBN-{random.randint(1, 120)}" # Bazıları geçersiz olacak
user_id = f"U{random.randint(1, 60):03d}" # Bazıları geçersiz olacak
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)
# Kitabı ödünç al
library.borrow_book("123456", "U001")
# Referansları doğrula
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 bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Özellikleri
Örnek ve Sınıf DeğişkenleriProperty DekoratörleriGizli ÖzniteliklerÖzet - Banka Hesabı Yöneticisi6Kapsülleme
Public, Protected, Private ÜyelerErişim BelirleyicilerBilgi Gizlemeİleri Seviye Property DekoratörleriÖzet - Öğrenci Kayıt Sistemi12Proje: Kütüphane Yönetimi
Projeye Genel BakışKitap ve Kullanıcı Sınıfları