Kapitel 10
Definition eigener Klassen
294
Wie bei den Attributen gibt es auch öffentliche und private Methoden. Die Namen von stark
privaten Methoden, die nur innerhalb der Klasse aufgerufen werden können, beginnen mit
einem doppelten Unterstrich, z.B.
__machedies(). Schwach private Methoden können
zwar von außen aufgerufen werden, ihre Namen werden aber mit
from ... import * nicht
importiert. Namen schwach privater Methoden beginnen mit einem Unterstrich, z.B.
_machedas(). Alle anderen Namen bezeichnen öffentliche Methoden.
10.5.1 Polymorphismus – Überladen von Operatoren
Ein wichtiges Konzept der objektorientierten Programmierung ist der Polymorphismus
(bzw. die Polymorphie). Damit ist die Möglichkeit gemeint, den gleichen Namen für (mehr
oder weniger) gleichartige Operationen zu verwenden, die auf Objekte unterschiedlicher
Klassen angewendet werden. Man spricht auch vom Überladen (overloading) einer Operation.
Sie kennen das bereits vom Plusoperator +. Er kann auf Zahlen und auf Strings angewendet
werden. Sind die Operanden Zahlen, bewirkt
+ eine Addition. Handelt es sich dagegen um
Sequenzen, werden die Operanden aneinandergehängt (konkateniert). Der Plusoperator ist
also überladen.
Bei Python können Operatoren und Standardfunktionen überladen werden, indem man bei
einer neuen Klasse bestimmte Methoden mit vorgegebenen Namen definiert. Diese reser-
vierten Methodennamen beginnen und enden mit doppelten Unterstrichen. In Tabelle 10.1
sind einige dieser speziellen Methoden aufgeführt.
Der Plusoperator wird z.B. durch die Methode
__add__() repräsentiert. Wenn man in einer
Klasse eine Methode mit diesem Namen definiert, kann der Plusoperator auch auf Objekte
der neuen Klasse angewendet werden.
Wir werden das nun am Beispiel der Klasse
Geld ausprobieren. Die Addition zweier Geld-
Objekte soll nicht mehr durch Aufruf einer Methode, sondern durch einen mathematischen
Term mit Pluszeichen formuliert werden können. Ziel ist also, dass Anweisungen der fol-
genden Form möglich sind:
Dazu brauchen wir nur die Methode
add() in __add__() umzubenennen. Wenn der Python-
Interpreter bei der Ausführung eines Skripts nun auf ein Pluszeichen stößt und das Objekt
vor dem Pluszeichen ein Objekt der Klasse
Geld ist, wandelt er den Term in einen Aufruf der
Methode
__add__() des Geld-Objektes um (Abbildung 10.6).
Abb. 10.6: Interpretation des überladenen Plusoperators +
ausgaben = hotelrechnung + mietwagen
Objekt der Klasse
Geld
ausgaben = hotelrechnung + mietwagen
ausgaben = hotelrechnung.__add__(mietwagen)
Python-Interpreter
295
10.5
Methoden
Die Methoden mit den doppelten Unterstrichen greifen also tief in das Verhalten des Lauf-
zeitsystems ein.
Methode Erläuterung
__abs__(self) Überladen der Funktion abs()
__add__(self, other) Überladen des Plusoperators +
__contains__
(self, item)
Überladen des in-Operators für eine Container-Klasse.
Zurückgegeben wird der Wahrheitswert
1 genau dann,
wenn das Objekt
self das Element item enthält.
__del__(self) Die Methode wird aufgerufen, wenn ein Objekt (durch
eine Anweisung der Form
del x) gelöscht werden soll.
Man nennt sie auch einen Destruktor.
__delitem__(self, key) Löschoperation für Container-Klassen. Entfernt wird das
Item mit Schlüssel
key. Die Anweisung del d[key]
bewirkt einen Aufruf der Methode d.__delitem__[key].
__eq__(self, other) Gleichheitsoperator ==. Die Auswertung des Vergleichs
a == b führt zum Methodenaufruf a.__eq__(b).
__float__(self) Überladen der Standardfunktion float()
__ge__(self, other)
Überladen des Größer-oder-gleich-Operators >=
__getitem__(self, key) Implementiert die Anweisung self[key] bei Container-
Klassen. Die Methode liefert das Element mit dem
Schlüssel
key.
__gt__(self, other) Überladen des Größer-als-Operators >
__iadd__(self, other)
Überladen der erweiterten Operation +=
__idiv__(self, other) Überladen von /=
__imul__(self, other) Überladen von *=
__le__(self, other)
Überladen des Kleiner-oder-gleich-Operators <=
__len__(self) Überladen der Standardfunktion len()
__lt__(self, other) Überladen des Kleiner-als-Operators <
__mod__(self, other)
Überladen des Modulo-Operators %
__mul__(self, other) Überladen des Multiplikationsoperators *
__ne__(self, other) Überladen des Ungleich-Operators !=
__neg__(self)
Überladen des Negationsoperators -
__nonzero__(self) Implementiert das Testen von Wahrheitswerten.
Die Methode sollte den Wert
1 zurückgeben, falls das
Objekt als »wahr« gelten soll, und sonst
0.
__setitem__(self, key,
value)
Implementiert die Zuweisung self[key]=value bei
Container-Klassen (z.B. Dictionaries, Sequenzen).
__str__(self) Liefert einen String, der das Objekt repräsentiert. Wird das
Objekt mit einer
print()-Funktion ausgegeben, so wird
diese Methode aufgerufen.
Tabelle 10.1: Einige reservierte Methodennamen mit doppelten Unterstrichen
Kapitel 10
Definition eigener Klassen
296
In der folgenden Klassendefinition finden mehrere Überladungen statt:
# geld2.py
class Geld(object):
__wechselkurs = {'USD':0.84998,
'G B P': 1 . 394 8 0 ,
'E U R': 1 . 0,
'J P Y': 0 . 007 1 6 8}
def __init__(self, waehrung, betrag):
self.waehrung = waehrung
self.betrag = float(betrag)
de f g etE u ro(s e lf) :
return self.betrag*self.__wechselkurs[geld.waehrung]
def __add__ (self, geld): #1
a = self.getEuro()
b = geld.getEuro()
faktor = 1.0/self.__wechselkurs[self.waehrung]
summe = Geld (self.waehrung, (a+b)*faktor ) #2
return summe
def __lt__(self, other): #3
a = self.getEuro ()
b = other.getEuro ()
r e turn a < b #4
def __le__(self, other):
a = self.getEuro ()
b = other.getEuro ()
return a <= b
def __eq__(self, other):
a = self.getEuro ()
b = other.getEuro ()
return a == b
de f _ _st r __(s e lf) : #5
return self.waehrung + " " + format(self.betrag, ".2f")

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.