Mutierbare Objekte

Als Beispiel für eine Klasse von Objekten deren Zustand veränderbar ist, implementieren wir Bankkonten, deren Guthaben zum Beispiel durch Einzahlungen verändert werden kann.

Zunächst definieren wir einen Konstruktor zum Erzeugen von Bankkonten. Dieser initialisiert das gespeicherte Guthaben mit dem Wert Null.

class Konto:
    def __init__(self):
        self._guthaben = 0.0

Obwohl Konten mutierbar sein werden, soll das Guthaben nicht direkt manipuliert werden. Wir benennen das entsprechende Attribut deshalb mit einem Unterstrich und definieren eine lesende Zugriffsmethode. Außerdem definieren wir Methoden zur Darstellung von Konten als Zeichenkette.

    def guthaben(self):
        return self._guthaben
    
    def __repr__(self):
        return str(self)
    
    def __str__(self):
        return "Guthaben: " + str(self._guthaben)

Nun definieren wir eine Methode einzahlen, die das gespeicherte Guthaben um den übergebenen Betrag erhöht.

    def einzahlen(self, betrag):
        self._guthaben = self._guthaben + betrag
        return self

Bei mutierenden Methoden ist es üblich, das Objekt, auf dem die Methode aufgerufen wurde, selbst zurück zu liefern. Dies ermöglicht es, mehrere Veränderungen auf einmal auszuführen, wie die folgenden Aufrufe zeigen.

>>> k = Konto()
>>> k
Guthaben: 0.0
>>> k.einzahlen(100)
Guthaben: 100.0
>>> k.einzahlen(100).einzahlen(100)
Guthaben: 300.0

Analog zum Einzahlen können wir auch das Abheben von einem Bankkonto implementieren.

    def abheben(self, betrag):
        self._guthaben = self._guthaben - betrag
        return self

Mit der bisherigen Implementierung können wir verschiedene Konten anlegen und diese unabhängig voneinander manipulieren. Mit Hilfe einer Überweisung können wir auch Transaktionen zwischen verschiedenen Konten implementieren. Die folgende Methode tut dies.

    def ueberweisen(self, other, betrag):
        self.abheben(betrag)
        other.einzahlen(betrag)
        return self

Die folgenden Aufrufe verdeutlichen den Effekt einer Überweisung.

>>> k1 = Konto()
>>> k1.einzahlen(100)
Guthaben: 100.0
>>> k2 = Konto()
>>> k1.ueberweisen(k2, 70)
Guthaben: 30.0
>>> k2
Guthaben: 70.0