Riepilogo - Gestore di conti bancari
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 16 di 64.
Sfida
MedioCrea una classe completa BankAccount che dimostri i concetti della programmazione orientata agli oggetti, inclusi variabili di classe, attributi privati, proprietà, getter, setter e metodi.
1. Crea una classe BankAccount con:
- Una variabile di classe
interest_rateimpostata su0.02(2%) - Attributi di istanza privati per
__owner_namee__balance - Un costruttore che inizializza questi attributi
2. Implementa i getter e i setter delle proprietà:
- Una proprietà di sola lettura
owner_nameche restituisce il nome del titolare del conto - Una proprietà
balancecon:- Un getter che restituisce il saldo corrente
- Un setter che convalida i depositi (rifiutando gli importi negativi)
- Se la convalida non va a buon fine, stampa:
"Balance cannot be negative"
3. Implementa i metodi:
deposit(amount)che:- Aggiunge l'importo al saldo se è positivo
- Stampa
"Deposit amount must be positive"e restituisceFalsese l'importo non è positivo - Restituisce
Truein caso di successo
withdraw(amount)che:- Sottrae l'importo dal saldo se è positivo e i fondi sono sufficienti
- Stampa
"Withdrawal amount must be positive"e restituisceFalsese l'importo non è positivo - Stampa
"Insufficient funds"e restituisceFalsese l'importo supera il saldo - Restituisce
Truein caso di successo
apply_interest()che:- Aggiunge gli interessi al saldo in base al tasso di interesse della classe
- Restituisce l'importo degli interessi
display_info()che stampa i dettagli del conto in questo formato:Account Owner: [owner_name] Balance: $[balance] Interest Rate: [interest_rate]%
Requisiti del formato di output
- Tutti i messaggi di errore di convalida devono essere stampati esattamente come specificato
- Il metodo
display_info()deve formattare l'output esattamente come mostrato sopra - Il tasso di interesse deve essere visualizzato come percentuale (moltiplicato per 100)
Provalo tu
from bank_account import BankAccount
# Gestore dei casi di test
test_case = input()
if test_case == "account_creation":
# Verifica la creazione del conto
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":
# Verifica la funzionalità di deposito
account = BankAccount("Bob", 500)
print(f"Initial balance: ${account.balance}")
# Deposito valido
result = account.deposit(300)
print(f"Deposit result: {result}")
print(f"New balance: ${account.balance}")
# Deposito non valido
result = account.deposit(-50)
print(f"Negative deposit result: {result}")
print(f"Balance after invalid deposit: ${account.balance}")
elif test_case == "withdraw_method":
# Verifica la funzionalità di prelievo
account = BankAccount("Charlie", 1000)
# Prelievo valido
result = account.withdraw(400)
print(f"Withdrawal result: {result}")
print(f"Balance after withdrawal: ${account.balance}")
# Prelievo non valido (negativo)
result = account.withdraw(-50)
print(f"Negative withdrawal result: {result}")
# Prelievo non valido (supera il saldo)
result = account.withdraw(1000)
print(f"Excessive withdrawal result: {result}")
print(f"Final balance: ${account.balance}")
elif test_case == "property_access":
# Verifica l'accesso alle proprietà e la loro protezione
account = BankAccount("Dave", 800)
print(f"Owner via property: {account.owner_name}")
print(f"Balance via property: ${account.balance}")
# Prova a impostare il saldo (si dovrebbe usare il setter)
account.balance = 1200
print(f"Balance after valid setter: ${account.balance}")
# Prova a impostare un saldo non valido
account.balance = -500
print(f"Balance after invalid setter: ${account.balance}")
# Prova ad accedere direttamente agli attributi privati (dovrebbe fallire)
try:
print(account.__owner_name)
except AttributeError:
print("Cannot access private owner_name directly")
elif test_case == "apply_interest":
# Verifica l'applicazione degli interessi
account = BankAccount("Eve", 2000)
# Controlla il saldo iniziale
print(f"Initial balance: ${account.balance}")
# Applica gli interessi
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":
# Verifica il formato del metodo display_info
account = BankAccount("Frank", 1500)
# Modifica il tasso di interesse per verificare la variabile di classe
original_rate = BankAccount.interest_rate
BankAccount.interest_rate = 0.03
print("Display info output:")
account.display_info()
# Ripristina il tasso originale
BankAccount.interest_rate = original_rate
elif test_case == "original_test_case":
# Esegui il codice di test originale della sfida
account = BankAccount("Coddy", 1000)
# Esegui le operazioni
account.deposit(500)
account.withdraw(200)
account.apply_interest()
# Mostra le informazioni sul conto
account.display_info()
# Verifica la convalida del setter
account.balance = 5000
print(f"Balance after setter: ${account.balance}")
# Verifica la convalida dei prelievi
account.withdraw(10000)
print(f"Final balance: ${account.balance}")Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online