Menu
Coddy logo textTech

Récapitulatif - Gestionnaire de compte bancaire

Fait partie de la section Programmation orientée objet du Journey Python de Coddy. Leçon 16 sur 64.

challenge icon

Défi

Moyen

Créez une classe BankAccount complète qui présente des concepts de la programmation orientée objet, notamment les variables de classe, les attributs privés, les propriétés, les accesseurs, les mutateurs et les méthodes. 

1. Créez une classe BankAccount avec :

  • Une variable de classe interest_rate définie à 0.02 (2 %)
  • Des attributs d’instance privés pour __owner_name et __balance
  • Un constructeur qui initialise ces attributs

2. Implémentez les accesseurs et mutateurs des propriétés :

  • Une propriété en lecture seule owner_name qui renvoie le nom du propriétaire du compte
  • Une propriété balance avec :
    • Un accesseur qui renvoie le solde actuel
    • Un mutateur qui valide les dépôts (en rejetant les montants négatifs)
    • Si la validation échoue, affichez : "Balance cannot be negative"

3. Implémentez les méthodes :

  • deposit(amount) qui :
    • Ajoute le montant au solde s’il est positif
    • Affiche "Deposit amount must be positive" et renvoie False si le montant n’est pas positif
    • Renvoie True en cas de réussite
  • withdraw(amount) qui :
    • Soustrait le montant du solde s’il est positif et si les fonds sont suffisants
    • Affiche "Withdrawal amount must be positive" et renvoie False si le montant n’est pas positif
    • Affiche "Insufficient funds" et renvoie False si le montant dépasse le solde
    • Renvoie True en cas de réussite
  • apply_interest() qui :
    • Ajoute les intérêts au solde en fonction du taux d’intérêt de la classe
    • Renvoie le montant des intérêts
  • display_info() qui affiche les informations du compte dans ce format :

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

Exigences relatives au format de sortie

  • Tous les messages d’erreur de validation doivent être affichés exactement comme indiqué
  • La méthode display_info() doit formater la sortie exactement comme indiqué ci-dessus
  • Le taux d’intérêt doit être affiché sous forme de pourcentage (multiplié par 100)

Essayez vous-même

from bank_account import BankAccount

# Gestionnaire de cas de test
test_case = input()

if test_case == "account_creation":
    # Tester la création de compte
    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":
    # Tester la fonctionnalité de dépôt
    account = BankAccount("Bob", 500)
    print(f"Initial balance: ${account.balance}")
    
    # Dépôt valide
    result = account.deposit(300)
    print(f"Deposit result: {result}")
    print(f"New balance: ${account.balance}")
    
    # Dépôt invalide
    result = account.deposit(-50)
    print(f"Negative deposit result: {result}")
    print(f"Balance after invalid deposit: ${account.balance}")

elif test_case == "withdraw_method":
    # Tester la fonctionnalité de retrait
    account = BankAccount("Charlie", 1000)
    
    # Retrait valide
    result = account.withdraw(400)
    print(f"Withdrawal result: {result}")
    print(f"Balance after withdrawal: ${account.balance}")
    
    # Retrait invalide (négatif)
    result = account.withdraw(-50)
    print(f"Negative withdrawal result: {result}")
    
    # Retrait invalide (dépasse le solde)
    result = account.withdraw(1000)
    print(f"Excessive withdrawal result: {result}")
    print(f"Final balance: ${account.balance}")

elif test_case == "property_access":
    # Tester l'accès aux propriétés et la protection
    account = BankAccount("Dave", 800)
    
    print(f"Owner via property: {account.owner_name}")
    print(f"Balance via property: ${account.balance}")
    
    # Essayer de définir le solde (devrait utiliser le setter)
    account.balance = 1200
    print(f"Balance after valid setter: ${account.balance}")
    
    # Essayer un solde invalide
    account.balance = -500
    print(f"Balance after invalid setter: ${account.balance}")
    
    # Essayer d'accéder directement aux attributs privés (devrait échouer)
    try:
        print(account.__owner_name)
    except AttributeError:
        print("Cannot access private owner_name directly")

elif test_case == "apply_interest":
    # Tester l'application des intérêts
    account = BankAccount("Eve", 2000)
    
    # Vérifier le solde initial
    print(f"Initial balance: ${account.balance}")
    
    # Appliquer les intérêts
    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":
    # Tester le format de la méthode display_info
    account = BankAccount("Frank", 1500)
    
    # Modifier le taux d'intérêt pour tester la variable de classe
    original_rate = BankAccount.interest_rate
    BankAccount.interest_rate = 0.03
    
    print("Display info output:")
    account.display_info()
    
    # Restaurer le taux original
    BankAccount.interest_rate = original_rate

elif test_case == "original_test_case":
    # Exécuter le code de test original du défi
    account = BankAccount("Coddy", 1000)

    # Effectuer des opérations
    account.deposit(500)
    account.withdraw(200)
    account.apply_interest()

    # Afficher les informations du compte
    account.display_info()

    # Tester la validation du setter
    account.balance = 5000
    print(f"Balance after setter: ${account.balance}")

    # Tester la validation du retrait
    account.withdraw(10000)
    print(f"Final balance: ${account.balance}")

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Python en ligne