Özet - Banka Hesabı Yöneticisi
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 16 / 64.
Görev
OrtaSınıf değişkenleri, özel öznitelikler (private attributes), özellikler (properties), alıcılar (getters), ayarlayıcılar (setters) ve metotlar dahil olmak üzere nesne yönelimli programlama kavramlarını gösteren eksiksiz bir BankAccount sınıfı oluşturun.
1. Aşağıdakilere sahip bir BankAccount sınıfı oluşturun:
0.02(%2) olarak ayarlanmış birinterest_ratesınıf değişkeni__owner_nameve__balanceiçin özel örnek öznitelikleri (private instance attributes)- Bu öznitelikleri başlatan bir yapıcı (constructor)
2. Özellik alıcılarını (getters) ve ayarlayıcılarını (setters) uygulayın:
- Hesap sahibinin adını döndüren salt okunur bir
owner_nameözelliği - Aşağıdakilere sahip bir
balanceözelliği:- Mevcut bakiyeyi döndüren bir alıcı (getter)
- Para yatırma işlemlerini doğrulayan (negatif tutarları reddeden) bir ayarlayıcı (setter)
- Doğrulama başarısız olursa şunu yazdırın:
"Balance cannot be negative"
3. Metotları uygulayın:
- Şunları yapan
deposit(amount):- Tutar pozitifse bakiyeye ekler
- Tutar pozitif değilse
"Deposit amount must be positive"yazdırır veFalsedöndürür - Başarılı olduğunda
Truedöndürür
- Şunları yapan
withdraw(amount):- Tutar pozitifse ve fonlar yeterliyse bakiyeden düşer
- Tutar pozitif değilse
"Withdrawal amount must be positive"yazdırır veFalsedöndürür - Tutar bakiyeyi aşarsa
"Insufficient funds"yazdırır veFalsedöndürür - Başarılı olduğunda
Truedöndürür
- Şunları yapan
apply_interest():- Sınıf faiz oranına göre bakiyeye faiz ekler
- Faiz tutarını döndürür
Hesap ayrıntılarını şu formatta yazdıran
display_info():Account Owner: [owner_name] Balance: $[balance] Interest Rate: [interest_rate]%
Çıktı Formatı Gereksinimleri
- Tüm doğrulama hata mesajları tam olarak belirtildiği gibi yazdırılmalıdır
display_info()metodu çıktıyı tam olarak yukarıda gösterildiği gibi formatlamalıdır- Faiz oranı yüzde olarak görüntülenmelidir (100 ile çarpın)
Kopya kağıdı
Nesne yönelimli programlama kavramlarını gösteren eksiksiz bir sınıf:
class BankAccount:
interest_rate = 0.02 # Sınıf değişkeni
def __init__(self, owner_name, initial_balance):
self.__owner_name = owner_name # Özel öznitelik
self.__balance = initial_balance # Özel öznitelik
@property
def owner_name(self): # Salt okunur özellik
return self.__owner_name
@property
def balance(self): # Alıcı (Getter)
return self.__balance
@balance.setter
def balance(self, value): # Doğrulamalı ayarlayıcı (Setter)
if value < 0:
print("Balance cannot be negative")
else:
self.__balance = value
def deposit(self, amount):
if amount <= 0:
print("Deposit amount must be positive")
return False
self.__balance += amount
return True
def withdraw(self, amount):
if amount <= 0:
print("Withdrawal amount must be positive")
return False
if amount > self.__balance:
print("Insufficient funds")
return False
self.__balance -= amount
return True
def apply_interest(self):
interest = self.__balance * self.interest_rate
self.__balance += interest
return interest
def display_info(self):
print(f"Account Owner: {self.__owner_name}")
print(f"Balance: ${self.__balance}")
print(f"Interest Rate: {self.interest_rate * 100}%")
Temel kavramlar:
- Sınıf değişkenleri: Tüm örnekler arasında paylaşılır
- Özel öznitelikler: Çift alt çizgi öneki (
__) kullanın - Özellikler (Properties): Alıcılar (getters) için
@propertydekoratörünü kullanın - Ayarlayıcılar (Setters):
@property_name.setterdekoratörünü kullanın - Doğrulama: Koşulları kontrol edin ve hata mesajları sağlayın
Kendin dene
from bank_account import BankAccount
# Test senaryosu işleyicisi
test_case = input()
if test_case == "account_creation":
# Hesap oluşturmayı test et
account = BankAccount("Alice", 1000)
print(f"Owner: {account.owner_name}")
print(f"Initial balance: ${account.balance}")
print(f"Interest rate: {BankAccount.interest_rate * 100}%")
elif test_case == "deposit_method":
# Para yatırma işlevini test et
account = BankAccount("Bob", 500)
print(f"Initial balance: ${account.balance}")
# Geçerli para yatırma
result = account.deposit(300)
print(f"Deposit result: {result}")
print(f"New balance: ${account.balance}")
# Geçersiz para yatırma
result = account.deposit(-50)
print(f"Negative deposit result: {result}")
print(f"Balance after invalid deposit: ${account.balance}")
elif test_case == "withdraw_method":
# Para çekme işlevini test et
account = BankAccount("Charlie", 1000)
# Geçerli para çekme
result = account.withdraw(400)
print(f"Withdrawal result: {result}")
print(f"Balance after withdrawal: ${account.balance}")
# Geçersiz para çekme (negatif)
result = account.withdraw(-50)
print(f"Negative withdrawal result: {result}")
# Geçersiz para çekme (bakiyeyi aşan)
result = account.withdraw(1000)
print(f"Excessive withdrawal result: {result}")
print(f"Final balance: ${account.balance}")
elif test_case == "property_access":
# Özellik erişimini ve korumasını test et
account = BankAccount("Dave", 800)
print(f"Owner via property: {account.owner_name}")
print(f"Balance via property: ${account.balance}")
# Bakiyeyi ayarlamaya çalış (setter kullanmalı)
account.balance = 1200
print(f"Balance after valid setter: ${account.balance}")
# Geçersiz bakiye dene
account.balance = -500
print(f"Balance after invalid setter: ${account.balance}")
# Özel niteliklere doğrudan erişmeyi dene (başarısız olmalı)
try:
print(account.__owner_name)
except AttributeError:
print("Cannot access private owner_name directly")
elif test_case == "apply_interest":
# Faiz uygulamasını test et
account = BankAccount("Eve", 2000)
# Orijinal bakiyeyi kontrol et
print(f"Initial balance: ${account.balance}")
# Faiz uygula
interest_earned = account.apply_interest()
expected_interest = 2000 * 0.02
print(f"Interest earned: ${interest_earned}")
print(f"New balance after interest: ${account.balance}")
print(f"Interest calculation correct: {interest_earned == expected_interest}")
elif test_case == "display_info":
# display_info metot formatını test et
account = BankAccount("Frank", 1500)
# Sınıf değişkenini test etmek için faiz oranını değiştir
original_rate = BankAccount.interest_rate
BankAccount.interest_rate = 0.03
print("Display info output:")
account.display_info()
# Orijinal oranı geri yükle
BankAccount.interest_rate = original_rate
elif test_case == "original_test_case":
# Yarışmadaki orijinal test kodunu çalıştır
account = BankAccount("Coddy", 1000)
# İşlemleri gerçekleştir
account.deposit(500)
account.withdraw(200)
account.apply_interest()
# Hesap bilgilerini görüntüle
account.display_info()
# Setter doğrulamasını test et
account.balance = 5000
print(f"Balance after setter: ${account.balance}")
# Para çekme doğrulamasını test et
account.withdraw(10000)
print(f"Final balance: ${account.balance}")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öneticisi