Menu
Coddy logo textTech

Özet - Banka Hesabı Yöneticisi

Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 16 / 64.

challenge icon

Görev

Orta

Sı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ış bir interest_rate sınıf değişkeni
  • __owner_name ve __balance iç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 ve False döndürür
    • Başarılı olduğunda True dö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 ve False döndürür
    • Tutar bakiyeyi aşarsa "Insufficient funds" yazdırır ve False döndürür
    • Başarılı olduğunda True dö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 @property dekoratörünü kullanın
  • Ayarlayıcılar (Setters): @property_name.setter dekoratö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