Menu
Coddy logo textTech

Riepilogo - Gestore di conti bancari

Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 16 di 64.

challenge icon

Sfida

Medio

Crea 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_rate impostata su 0.02 (2%)
  • Attributi di istanza privati per __owner_name e __balance
  • Un costruttore che inizializza questi attributi

2. Implementa i getter e i setter delle proprietà: 

  • Una proprietà di sola lettura owner_name che restituisce il nome del titolare del conto
  • Una proprietà balance con:
    • 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 restituisce False se l'importo non è positivo
    • Restituisce True in 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 restituisce False se l'importo non è positivo
    • Stampa "Insufficient funds" e restituisce False se l'importo supera il saldo
    • Restituisce True in 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

Esercitati da solo: Compilatore Python online