Menu
Coddy logo textTech

Powtórzenie — menedżer kont bankowych

Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 16 z 64.

challenge icon

Wyzwanie

Średni

Utwórz kompletną klasę BankAccount, która demonstruje koncepcje programowania obiektowego, w tym zmienne klasowe, atrybuty prywatne, właściwości, metody pobierające, metody ustawiające i metody. 

1. Utwórz klasę BankAccount z:

  • Zmienną klasową interest_rate ustawioną na 0.02 (2%)
  • Prywatnymi atrybutami instancji __owner_name i __balance
  • Konstruktorem, który inicjalizuje te atrybuty

2. Zaimplementuj metody pobierające i ustawiające właściwości: 

  • Właściwość tylko do odczytu owner_name, która zwraca imię i nazwisko właściciela konta
  • Właściwość balance z:
    • Metodą pobierającą, która zwraca bieżące saldo
    • Metodą ustawiającą, która weryfikuje wpłaty (odrzucając ujemne kwoty)
    • Jeśli weryfikacja się nie powiedzie, wypisz: "Balance cannot be negative"

3. Zaimplementuj metody:

  • deposit(amount), która:
    • Dodaje kwotę do salda, jeśli jest dodatnia
    • Wypisuje "Deposit amount must be positive" i zwraca False, jeśli kwota nie jest dodatnia
    • Zwraca True w przypadku powodzenia
  • withdraw(amount), która:
    • Odejmuje kwotę od salda, jeśli jest dodatnia, a środki są wystarczające
    • Wypisuje "Withdrawal amount must be positive" i zwraca False, jeśli kwota nie jest dodatnia
    • Wypisuje "Insufficient funds" i zwraca False, jeśli kwota przekracza saldo
    • Zwraca True w przypadku powodzenia
  • apply_interest(), która:
    • Dodaje odsetki do salda na podstawie stopy procentowej klasy
    • Zwraca kwotę odsetek
  • display_info(), która wypisuje szczegóły konta w następującym formacie:

    Account Owner: [owner_name]
    Balance: $[balance]
    Interest Rate: [interest_rate]%

Wymagania dotyczące formatu wyjściowego

  • Wszystkie komunikaty o błędach weryfikacji muszą być wypisywane dokładnie tak, jak podano
  • Metoda display_info() musi formatować dane wyjściowe dokładnie tak, jak pokazano powyżej
  • Stopa procentowa powinna być wyświetlana jako wartość procentowa (pomnóż ją przez 100)

Spróbuj swoich sił

from bank_account import BankAccount

# Obsługa przypadku testowego
test_case = input()

if test_case == "account_creation":
    # Test tworzenia konta
    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":
    # Test funkcjonalności wpłat
    account = BankAccount("Bob", 500)
    print(f"Initial balance: ${account.balance}")
    
    # Poprawna wpłata
    result = account.deposit(300)
    print(f"Deposit result: {result}")
    print(f"New balance: ${account.balance}")
    
    # Niepoprawna wpłata
    result = account.deposit(-50)
    print(f"Negative deposit result: {result}")
    print(f"Balance after invalid deposit: ${account.balance}")

elif test_case == "withdraw_method":
    # Test funkcjonalności wypłat
    account = BankAccount("Charlie", 1000)
    
    # Poprawna wypłata
    result = account.withdraw(400)
    print(f"Withdrawal result: {result}")
    print(f"Balance after withdrawal: ${account.balance}")
    
    # Niepoprawna wypłata (ujemna kwota)
    result = account.withdraw(-50)
    print(f"Negative withdrawal result: {result}")
    
    # Niepoprawna wypłata (kwota przekracza saldo)
    result = account.withdraw(1000)
    print(f"Excessive withdrawal result: {result}")
    print(f"Final balance: ${account.balance}")

elif test_case == "property_access":
    # Test dostępu do właściwości i ich ochrony
    account = BankAccount("Dave", 800)
    
    print(f"Owner via property: {account.owner_name}")
    print(f"Balance via property: ${account.balance}")
    
    # Spróbuj ustawić saldo (należy użyć metody ustawiającej)
    account.balance = 1200
    print(f"Balance after valid setter: ${account.balance}")
    
    # Spróbuj ustawić niepoprawne saldo
    account.balance = -500
    print(f"Balance after invalid setter: ${account.balance}")
    
    # Spróbuj uzyskać bezpośredni dostęp do prywatnych atrybutów (powinno się nie udać)
    try:
        print(account.__owner_name)
    except AttributeError:
        print("Cannot access private owner_name directly")

elif test_case == "apply_interest":
    # Przetestuj naliczanie odsetek
    account = BankAccount("Eve", 2000)
    
    # Sprawdź początkowe saldo
    print(f"Initial balance: ${account.balance}")
    
    # Nalicz odsetki
    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":
    # Przetestuj format metody display_info
    account = BankAccount("Frank", 1500)
    
    # Zmień stopę procentową, aby przetestować zmienną klasową
    original_rate = BankAccount.interest_rate
    BankAccount.interest_rate = 0.03
    
    print("Display info output:")
    account.display_info()
    
    # Przywróć pierwotną stopę procentową
    BankAccount.interest_rate = original_rate

elif test_case == "original_test_case":
    # Uruchom oryginalny kod testowy z zadania
    account = BankAccount("Coddy", 1000)

    # Wykonaj operacje
    account.deposit(500)
    account.withdraw(200)
    account.apply_interest()

    # Wyświetl informacje o koncie
    account.display_info()

    # Przetestuj walidację w setterze
    account.balance = 5000
    print(f"Balance after setter: ${account.balance}")

    # Przetestuj walidację wypłaty
    account.withdraw(10000)
    print(f"Final balance: ${account.balance}")

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online