Aufgabe 08 - Konto mit Klasse
Aufgabe 08 - Konto mit Klasse
Abschnitt betitelt „Aufgabe 08 - Konto mit Klasse“Worum geht es?
Abschnitt betitelt „Worum geht es?“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.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel Klassen in Python vollständig.
- Python, VS Code.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie schreiben Klassen mit Konstruktor, Methoden und
selffehlerfrei. - Sie setzen Kapselung mit der Unterstrich-Konvention und Properties gezielt ein.
- Sie unterscheiden Klassen- und Instanzattribute und begründen deren Einsatz.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- 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).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Teil A - Die Grundklasse
Abschnitt betitelt „Teil A - Die Grundklasse“- Implementieren Sie
Accountmit den Attributenownerundbalance(Startwert über den Konstruktor, Default 0) und der Methodedeposit(amount), die nur positive Beträge akzeptiert. - 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.
- Rufen Sie absichtlich
Account.deposit(50)ohne Objekt auf, lesen Sie die Fehlermeldung und erklären Sie in einem Satz, was sie mitselfzu tun hat.
Teil B - Kapselung und Properties
Abschnitt betitelt „Teil B - Kapselung und Properties“- Stellen Sie um: Der Kontostand heißt jetzt
_balanceund ist von außen nur über eine Propertybalancelesbar;account.balance = 99soll fehlschlagen (Property ohne Setter). Probieren Sie beides aus und notieren Sie das Verhalten. - 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). - Experiment: Greifen Sie von außen auf
account._balancezu, und danach auf ein testweise angelegtes__secret-Attribut. Was passiert jeweils? Fassen Sie Pythons Kapselungsphilosophie in einem Satz zusammen. - Implementieren Sie
__str__, sodassprint(account)etwaaccount of Ada: 125.50 EURliefert (Formatangabe mit zwei Nachkommastellen).
Teil C - Klassenattribut und Demo
Abschnitt betitelt „Teil C - Klassenattribut und Demo“- Zählen Sie mit einem Klassenattribut
account_countmit, wie viele Konten insgesamt erzeugt wurden (Erhöhung im Konstruktor). Erklären Sie am Beispiel den Unterschied zum Instanzattribut in zwei Sätzen. - Ergänzen Sie eine Buchungsliste
_transactions, in der jede Ein- und Auszahlung als Text abgelegt wird, sowieprint_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. - Schreiben Sie ein Demo-Skript hinter
if __name__ == "__main__":, das zwei Konten anlegt, gültige und ungültige Buchungen zeigt, beide Konten druckt undaccount_countausgibt. 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“- 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. - Ergänzen Sie
__repr__nach der Konvention aus dem Kapitel (nachbaubarer Ausdruck) und zeigen Sie den Unterschied zu__str__in der REPL. - 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. - Erweitern Sie die Demo um eine Überweisung samt Kontoauszug beider Konten.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Was bedeutet die Fehlermeldung
deposit() takes 1 positional argument but 2 were givenin Klartext? - Warum verhindert eine Property ohne Setter das Setzen von außen, obwohl
_balancetechnisch erreichbar bleibt? - Wann wird
__str__verwendet, wann__repr__? - Warum ist
tracks = []im Klassenkörper ein Fehler,interest_rate = 0.02aber in Ordnung? - 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.