Kapitel 10
Definition eigener Klassen
304
Da die str()-Funktion mit der __str__()-Methode überladen wurde, kann eine Repräsen-
tation des Objektes mit einer
print-Anweisung auf den Bildschirm gebracht werden:
Wir drucken einen Kontoauszug aus ...
... und noch einen Kontoauszug:
Man erkennt, dass – wie beabsichtigt – beim ersten Ausdruck der Kontoauszug des Objektes
konto gelöscht wurde. Da es inzwischen keine neuen Buchungen gab, enthält der zweite
Kontoauszug nur die Beschreibung des Kontos.
10.8.3 Vertiefung: Standardklassen als Basisklassen
Von Standardklassen wie int, float, str, bool, dict, list können ebenso neue Klassen
abgeleitet werden wie von selbst definierten Klassen. Zum Beispiel können Sie eine Liste mit
zusätzlichen Methoden definieren. Im folgenden Skript definieren wir eine Liste mit einem
voreingestellten Wert (Default) für nicht existierende Listenelemente. Bei einem Zugriff auf
die Liste mit einem zu großen Index soll es keinen Laufzeitfehler geben (IndexError), son-
dern stattdessen soll ein für diesen Fall vorgesehenes Objekt zurückgegeben werden:
>>> print(konto)
Konto von Tim Wegner:
Kontostand am Fri Jun 06 20:43:02 2003: EUR 1199.76
>>> konto.druckeKontoauszug()
Konto von Tim Wegner:
Kontostand am Fri Jun 06 20:42:18 2003: EUR 0.00
Fri Jun 06 20:42:30 2003 EUR 1200.00 neuer Kontostand: EUR 1200.00
Fri Jun 06 20:42:40 2003 USD -50.00 neuer Kontostand: EUR 1157.50
Fri Jun 06 20:42:50 2003 GBP 30.30 neuer Kontostand: EUR 1199.76
>>> konto.druckeKontoauszug()
Konto von Tim Wegner:
Kontostand am Fri Jun 06 20:43:14 2003: EUR 1199.76
class Defaultlist(list):
def __init__(self, s=[], default=0): #1
self.default = default
l i st._ _ ini t _ _ (se l f, s ) #2
def __getitem__(self, index):
t r y:
return list.__getitem__(self, index) #3
except IndexError:
r etu r n sel f .def a ult #4
305
10.8
Vererbung
Erläuterung:
#1: Bei der Instanziierung können optional eine Liste und ein Defaultwert übergeben wer-
den. Wenn beim Aufruf des Konstruktors das zweite Argument fehlt, ist der Defaultwert
null. Wenn auch noch das erste Argument fehlt, wird eine leere Liste erzeugt (zu optionalen
Argumenten siehe Abschnitt 6.5).
#2: Die Methode __init__() der Basisklasse list wird aufgerufen. Es handelt sich um
einen ungebundenen Methodenaufruf. Ungebundene Methodenaufrufe haben das Format
klasse.methode (objekt, arg1, ...). Sie sind nicht an eine Instanz (Objekt) der Klasse
gebunden, sondern übergeben ein Objekt im ersten Argument.
#3: Die Methode __getitem__() der Basisklasse list wird versuchsweise aufgerufen.
Diese magische Methode kommt zum Einsatz, wenn man mit einem Ausdruck der Form
liste[index] auf ein Element der Liste (item) zugreifen will.
#4: Wenn der Zugriff auf ein Listenelement misslingt, weil der angegebene Index ungültig
ist, wird der Defaultwert zurückgegeben.
Im interaktiven Modus testen wir die neue Klasse:
Das Objekt
planeten der Klasse Defaultlist zeigt also das erwünschte Verhalten und gibt
den Defaultwert '
unbekannter Planet' zurück, wenn man versucht, auf ein nicht existie-
rendes Listenelement wie
planeten[3] zuzugreifen. Außerdem funktionieren auch die
von der Basisklasse
list geerbten Methoden. Wir prüfen das am Beispiel der Methode
append(), die ein neues Element an eine Liste anhängt:
Ein Problem tritt auf, wenn wir zwei Objekte der Klasse
Defaultlist konkatenieren:
>>> p = ["Merkur", "Venus", "Erde"]
>>> planeten = Defaultlist(p, "unbekannter Planet")
>>> planeten
['Merkur', 'Venus', 'Erde']
>>> planeten[2]
'Erde'
>>> planeten[3]
'unbekannter Planet'
>>> planeten.append("Mars")
>>> planeten
['Merkur', 'Venus', 'Erde', 'Mars']
>>> planeten[10]
'unbekannter Planet'
>>> mehrPlaneten = Defaultlist(["Jupiter", "Saturn"],
"u n b e kan n ter P lan e t ")
>>> planeten = planeten + mehrPlaneten #1
>>> planeten

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.