Zum Inhalt springen

Aufgabe 08 - Konto mit Klasse

Zu Zen-Modus wechseln

Sie implementieren ein Bankkonto als Python-Klasse und wenden dabei alle Bausteine des Kapitels an: Konstruktor, Methoden, Kapselung, Properties, __str__ sowie den Unterschied zwischen Klassen- und Instanzattributen (siehe Kapitel Klassen in Python). Das Konto ist bewusst klein gewählt; es geht um saubere Handwerkstechnik, nicht um Fachlichkeit. Dieselbe Klasse wird in einer späteren Übung (Exceptions) weiter ausgebaut, Ihre Arbeit hier zahlt sich also doppelt aus.

  • Kapitel Klassen in Python vollständig.
  • Python, VS Code.
  • Sie schreiben Klassen mit Konstruktor, Methoden und self fehlerfrei.
  • Sie setzen Kapselung mit der Unterstrich-Konvention und Properties gezielt ein.
  • Sie unterscheiden Klassen- und Instanzattribute und begründen deren Einsatz.
  • Reproduktion: die Klassensyntax wiedergeben und eine einfache Klasse nach Vorgabe erstellen (Teil A).
  • Reorganisation und Transfer: Kapselung und Properties auf das Konto anwenden, Experimente durchführen und beschreiben (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: ein erweitertes Verhalten selbst entwerfen und Entwurfsentscheidungen begründen (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

  1. Implementieren Sie Account mit den Attributen owner und balance (Startwert über den Konstruktor, Default 0) und der Methode deposit(amount), die nur positive Beträge akzeptiert.
  2. Erzeugen Sie zwei Konten, zahlen Sie auf eines ein und geben Sie beide Kontostände aus. Bestätigen Sie damit: Jedes Objekt hat seine eigenen Werte.
  3. Rufen Sie absichtlich Account.deposit(50) ohne Objekt auf, lesen Sie die Fehlermeldung und erklären Sie in einem Satz, was sie mit self zu tun hat.
  1. Stellen Sie um: Der Kontostand heißt jetzt _balance und ist von außen nur über eine Property balance lesbar; account.balance = 99 soll fehlschlagen (Property ohne Setter). Probieren Sie beides aus und notieren Sie das Verhalten.
  2. Ergänzen Sie withdraw(amount): nur möglich, wenn der Betrag positiv und gedeckt ist; andernfalls vorerst eine gedruckte Meldung (die saubere Lösung mit Exceptions folgt in einer späteren Übung).
  3. Experiment: Greifen Sie von außen auf account._balance zu, und danach auf ein testweise angelegtes __secret-Attribut. Was passiert jeweils? Fassen Sie Pythons Kapselungsphilosophie in einem Satz zusammen.
  4. Implementieren Sie __str__, sodass print(account) etwa account of Ada: 125.50 EUR liefert (Formatangabe mit zwei Nachkommastellen).
  1. Zählen Sie mit einem Klassenattribut account_count mit, wie viele Konten insgesamt erzeugt wurden (Erhöhung im Konstruktor). Erklären Sie am Beispiel den Unterschied zum Instanzattribut in zwei Sätzen.
  2. Ergänzen Sie eine Buchungsliste _transactions, in der jede Ein- und Auszahlung als Text abgelegt wird, sowie print_statement() zur Ausgabe. Warum muss diese Liste im Konstruktor angelegt werden und darf nicht als Klassenattribut definiert sein? Antwort als Kommentar, gerne mit einem kurzen Experiment als Beleg.
  3. Schreiben Sie ein Demo-Skript hinter if __name__ == "__main__":, das zwei Konten anlegt, gültige und ungültige Buchungen zeigt, beide Konten druckt und account_count ausgibt. Recherchieren Sie kurz, was der __name__-Mechanismus bewirkt, und erklären Sie ihn in einem Kommentar.

Teil D - Expertenteil: Überweisung und Vergleichbarkeit

Abschnitt betitelt „Teil D - Expertenteil: Überweisung und Vergleichbarkeit“
  1. Implementieren Sie transfer(self, target, amount): bucht vom eigenen Konto ab und zahlt beim Zielkonto ein, aber nur ganz oder gar nicht. Bedenken Sie den Fall, dass die Abbuchung möglich wäre, die Einzahlung aber abgelehnt wird (etwa negativer Betrag durch einen Programmierfehler): Der Ausgangszustand muss dann erhalten bleiben. Beschreiben Sie Ihre Strategie in einem Kommentar.
  2. Ergänzen Sie __repr__ nach der Konvention aus dem Kapitel (nachbaubarer Ausdruck) und zeigen Sie den Unterschied zu __str__ in der REPL.
  3. Implementieren Sie __eq__, sodass zwei Konten als gleich gelten, wenn Inhaber und Kontostand übereinstimmen. Diskutieren Sie in zwei Sätzen, ob diese Definition fachlich sinnvoll ist oder ob Konten besser nie gleich sein sollten; es gibt gute Argumente für beides, gefragt ist Ihre begründete Position.
  4. Erweitern Sie die Demo um eine Überweisung samt Kontoauszug beider Konten.
  1. Was bedeutet die Fehlermeldung deposit() takes 1 positional argument but 2 were given in Klartext?
  2. Warum verhindert eine Property ohne Setter das Setzen von außen, obwohl _balance technisch erreichbar bleibt?
  3. Wann wird __str__ verwendet, wann __repr__?
  4. Warum ist tracks = [] im Klassenkörper ein Fehler, interest_rate = 0.02 aber in Ordnung?
  5. Was bewirkt if __name__ == "__main__":, und warum gehört das Demo-Skript dahinter?

account.py mit Klasse und Demo-Skript; die Experiment-Ergebnisse aus Teil B und die Begründungen als Kommentare im Code.