Powtórzenie — menedżer kont bankowych
Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 16 z 64.
Wyzwanie
ŚredniUtwó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_rateustawioną na0.02(2%) - Prywatnymi atrybutami instancji
__owner_namei__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ść
balancez:- 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 zwracaFalse, jeśli kwota nie jest dodatnia - Zwraca
Truew 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 zwracaFalse, jeśli kwota nie jest dodatnia - Wypisuje
"Insufficient funds"i zwracaFalse, jeśli kwota przekracza saldo - Zwraca
Truew 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
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online