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