Banksystem
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 62 von 64.
Aufgabe
SchwerIn dieser Herausforderung wirst du ein Bankensystem mit mehreren Kontotypen, Transaktionen und einem zentralen Bankmanager erstellen.
Implementiere das Bankensystem, indem du die TODO-Elemente in diesen Dateien vervollständigst:
transaction.py- Transaction-Klasse zur Aufzeichnung von Finanzaktivitätenaccount.py- Abstrakte Account-Basisklasse mit allgemeiner Funktionalitätsavingsaccount.py- SavingsAccount-Implementierung mit Zinsen und Mindestguthabencheckingaccount.py- CheckingAccount-Implementierung mit Überziehungsmöglichkeitenbank.py- Bank-Klasse zur Verwaltung von Konten und Überweisungen
Spickzettel
Diese Herausforderung umfasst den Aufbau eines Bankensystems mit objektorientierten Programmierkonzepten, einschließlich:
- Transaction-Klasse - Zeichnet Finanzaktivitäten auf
- Abstrakte Account-Klasse - Basisklasse mit gemeinsamer Kontofunktionalität
- SavingsAccount - Kontotyp mit Zinsberechnung und Mindestguthabenanforderungen
- CheckingAccount - Kontotyp mit Überziehungsschutzfunktionen
- Bank-Klasse - Zentraler Verwalter für Konten und Geldtransfers
Zu den Schlüsselkonzepten gehören Vererbung, Abstraktion, Kapselung und Polymorphismus, um eine modulare Architektur für ein Bankensystem zu erstellen.
Probier es selbst
from transaction import Transaction
from account import Account
from savingsaccount import SavingsAccount
from checkingaccount import CheckingAccount
from bank import Bank
# Umfassender Testfall-Handler, der alle Szenarien und Grenzfälle abdeckt
test_case = input()
if test_case == "transaction_class":
# Teste Transaction-Klasse
transaction = Transaction("deposit", 100.50, None)
print(str(transaction))
transaction = Transaction("withdrawal", 75.25, None)
print(str(transaction))
elif test_case == "account_deposit":
# Teste Einzahlungsfunktionalität
savings = SavingsAccount("S123", "John Doe", 500)
# Positiver Betrag
success, message = savings.deposit(200)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Balance: ${savings.get_balance():.2f}")
# Negativer Betrag (sollte fehlschlagen)
success, message = savings.deposit(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "savings_withdraw":
# Teste Auszahlung vom Sparkonto
savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
# Gültige Auszahlung
success, message = savings.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Ungültig (unter Mindestguthaben)
success, message = savings.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Negativer Betrag
success, message = savings.withdraw(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "checking_withdraw":
# Teste Auszahlung vom Girokonto
checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
# Normale Auszahlung
success, message = checking.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Auszahlung mit Überziehung
success, message = checking.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Überziehungslimit überschritten
success, message = checking.withdraw(200)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "interest_application":
# Teste Zinsgutschrift
savings = SavingsAccount("S123", "John Doe", 1000, interest_rate=0.05)
success, message = savings.apply_interest()
print(f"Success: {success}")
print(f"Message: {message}")
print(f"New Balance: ${savings.get_balance():.2f}")
# Transaktionsverlauf prüfen
transactions = savings.get_transaction_history()
print(f"Transaction count: {len(transactions)}")
print(f"Last transaction: {transactions[-1]}")
elif test_case == "bank_create_account":
# Teste Erstellung eines Bankkontos
bank = Bank("Test Bank")
# Erstelle ein Sparkonto
success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
print(f"Success: {success}")
print(f"Message: {message}")
# Erstelle ein Girokonto
success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
print(f"Success: {success}")
print(f"Message: {message}")
# Erstellung mit doppelter Kontonummer
success, message = bank.create_account("savings", "S123", "Another Person", 200)
print(f"Success: {success}")
print(f"Message: {message}")
# Erstellung mit ungültigem Typ
success, message = bank.create_account("invalid", "I789", "Test Person", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "bank_transfer":
# Teste Banküberweisungs-Funktionalität
bank = Bank("Transfer Test Bank")
# Erstelle zwei Konten
bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
bank.create_account("checking", "C456", "Jane Smith", 500)
# Gültige Überweisung
success, message = bank.transfer("S123", "C456", 300)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Source balance: ${bank.get_account('S123').get_balance():.2f}")
print(f"Destination balance: ${bank.get_account('C456').get_balance():.2f}")
# Ungültige Überweisung (unterschreitet Mindestguthaben)
success, message = bank.transfer("S123", "C456", 700)
print(f"Success: {success}")
print(f"Message: {message}")
# Ungültiges Konto
success, message = bank.transfer("NONEXISTENT", "C456", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "full_banking_workflow":
# Teste einen vollständigen Workflow
bank = Bank("Full Workflow Bank")
# Konten erstellen
bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.05, min_balance=200)
bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=250)
# Einzahlungen vornehmen
savings = bank.get_account("S123")
checking = bank.get_account("C456")
savings.deposit(300)
checking.deposit(200)
# Eine Überweisung tätigen
bank.transfer("S123", "C456", 400)
# Zinsen auf Sparkonto anwenden
savings.apply_interest()
# Eine Auszahlung vom Girokonto mit Überziehung vornehmen
checking.withdraw(900)
# Endzustand ausgeben
print("Final Account States:")
print(f"Savings (S123): ${savings.get_balance():.2f}")
print(f"Checking (C456): ${checking.get_balance():.2f}")
print("\nTransaction History (Savings):")
for transaction in savings.get_transaction_history():
print(f"- {transaction}")
print("\nTransaction History (Checking):")
for transaction in checking.get_transaction_history():
print(f"- {transaction}")
elif test_case == "inheritance_validation_test":
# Umfassende Validierung der Vererbung
objects = []
if 'Transaction' in locals():
objects.append(Transaction('test_param', 100, None))
if 'SavingsAccount' in locals():
objects.append(SavingsAccount('test_param', 'Test User'))
if 'CheckingAccount' in locals():
objects.append(CheckingAccount('test_param', 'Test User'))
if 'Bank' in locals():
objects.append(Bank('test_param'))
for obj in objects:
print(f'{type(obj).__name__}:')
print(f' MRO: {[cls.__name__ for cls in type(obj).__mro__]}')
print()
elif test_case == "method_overriding_test":
# Teste das Verhalten beim Überschreiben von Methoden
print('Testing method overriding...')
# Instanzen erstellen und überschriebene Methoden testen
if 'SavingsAccount' in locals():
obj = SavingsAccount('test', 'Test User')
print(f'SavingsAccount methods work correctly')
if 'CheckingAccount' in locals():
obj = CheckingAccount('test', 'Test User')
print(f'CheckingAccount methods work correctly')
elif test_case == "attribute_access_test":
# Teste Attributzugriff
print('Testing attribute access...')
if 'Transaction' in locals():
obj = Transaction('test', 100, None)
print(f'Transaction attributes accessible')
if 'SavingsAccount' in locals():
obj = SavingsAccount('test', 'Test User')
print(f'SavingsAccount attributes accessible')
if 'CheckingAccount' in locals():
obj = CheckingAccount('test', 'Test User')
print(f'CheckingAccount attributes accessible')
if 'Bank' in locals():
obj = Bank('test')
print(f'Bank attributes accessible')
elif test_case == "boundary_conditions_test":
# Teste Randbedingungen und Grenzwerte
print('Running boundary_conditions_test test...')
print('Test completed successfully')
elif test_case == "error_handling_test":
# Teste Fehlerbehandlung und Ausnahmeszenarien
print('Running error_handling_test test...')
print('Test completed successfully')
elif test_case == "polymorphic_behavior_test":
# Teste polymorphes Verhalten mit gemischten Objekten
print('Running polymorphic_behavior_test test...')
print('Test completed successfully')
elif test_case == "stress_test":
# Belastungstest mit mehreren Objekten
import time
start_time = time.time()
objects = []
for i in range(50):
try:
objects.append(Transaction(f'test_{i}', 100, None))
except:
pass # Erstellungsfehler gnädig behandeln
try:
objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
except:
pass # Erstellungsfehler gnädig behandeln
try:
objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
except:
pass # Erstellungsfehler gnädig behandeln
try:
objects.append(Bank(f'test_{i}'))
except:
pass # Erstellungsfehler gnädig behandeln
end_time = time.time()
print(f'Created {len(objects)} objects')
print(f'Time taken: {end_time - start_time:.4f} seconds')
print('Stress test completed')
elif test_case == "comprehensive_validation":
# Umfassender Validierungstest
print('=== Comprehensive Validation Test ===')
# Test 1: Grundlegende Objekterstellung
print('1. Basic Object Creation:')
success_count = 0
classes = ['Transaction', 'SavingsAccount', 'CheckingAccount', 'Bank']
try:
obj = Transaction('test', 100, None)
success_count += 1
print(f' Transaction: Created successfully')
except Exception as e:
print(f' Transaction: Creation failed - {e}')
try:
obj = SavingsAccount('test', 'Test User')
success_count += 1
print(f' SavingsAccount: Created successfully')
except Exception as e:
print(f' SavingsAccount: Creation failed - {e}')
try:
obj = CheckingAccount('test', 'Test User')
success_count += 1
print(f' CheckingAccount: Created successfully')
except Exception as e:
print(f' CheckingAccount: Creation failed - {e}')
try:
obj = Bank('test')
success_count += 1
print(f' Bank: Created successfully')
except Exception as e:
print(f' Bank: Creation failed - {e}')
print(f' Successfully created {success_count}/{len(classes)} classes')
print('=== Validation Complete ===')Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen