Exkurs - Implementierung in Python
Deklaration einer Klasse
Am Beispiel der Klasse Ampel
sollen die Besonderheiten aufgezeigt werden, die man bei der
Implementierung von Klassen in Python beachten muss.
Ausgangspunkt ist das folgende Klassendiagramm, das die Struktur der Klasse Ampel
beschreibt.
Eine Implementierung in Python könnte wie folgt aussehen (beachte, dass auch andere Implementierungen möglich sind):
class Ampel(object):
def __init__(self):
self.lampeRot = False
self.lampeGelb = False
self.lampeGruen = False
def setLampen(self, startwertLampeRot, startwertLampeGelb, startwertLampeGruen):
self.lampeRot = startwertLampeRot
self.lampeGelb = startwertLampeGelb
self.lampeGruen = startwertLampeGruen
def schalten(self):
if (self.lampeRot, self.lampeGelb, self.lampeGruen) == (True, False, False):
self.lampeGelb = True
elif (self.lampeRot, self.lampeGelb, self.lampeGruen) == (True, True, False):
self.lampeRot = False
self.lampeGelb = False
self.lampeGruen = True
elif (self.lampeRot, self.lampeGelb, self.lampeGruen) == (False, False, True):
self.lampeGelb = True
self.lampeGruen = False
elif (self.lampeRot, self.lampeGelb, self.lampeGruen) == (False, True, False):
self.lampeRot = True
self.lampeGelb = False
Eine Klassendeklaration wird immer mit dem Schlüsselwort class
eingeleitet.
Es folgt der Klassenname und in Klammern die Oberklasse, von der die neue Klasse abgeleitet wird.
Mehr hierzu wird im Abschnitt
Vererbung
erläutert.
Im vorliegenden Fall ist die Oberklasse die vom Python-System vorgegebene Klasse object
,
die man immer dann verwenden sollte, wenn keine speziellen Oberklassen vorgesehen sind.
Der Konstruktor (einer jeden Klasse) wird in Python mit __init__
bezeichnet (beachte: zwei Unterstrichen
vor und nach dem Wort init). Beachte, dass Klassendiagramme programmiersprachenunabhängig erstellt werden.
Der Konstruktor wird daher im Klassendiagramm und der zugehörigen Python-Implementierung unterschiedlich
dargestellt.
Die Konstruktormethode verwendet - wie auch alle anderen Methoden - einen ersten Parameter self
.
Dieser Parameter wird bei der Ausführung der Methode durch das betreffende Objekt aktualisiert.
Dieser Parameter darf nicht fehlen, da mit ihm in Python eine Prozedur- bzw. Funktionsdeklaration
erst zu einer Methodendeklaration innerhalb einer Klasse wird. Man darf den Parameter aber anders benennen. Wir
verzichten darauf und benutzen die übliche Konvention, ihn mit self
zu bezeichnen.
Bei der Implementierung der Konstruktormethode sollten alle Attribute eingeführt und gegebenenfalls mit Anfangswerten versehen werden. Hierdurch verschafft man sich einen Überblick über sämtliche Attribute der Klasse.
Attribute werden in Python in der Form self.attributname
dargestellt, wobei hier der
erste Parameter der Methodendeklaration (hier also self
) dem Attributnamen vorangestellt wird.
Im Klassendiagramm wird dieser Python-spezifische Zusatz nicht aufgeführt.
Beachte, dass jede Methode einen ersten Parameter self
hat (s. o.).
Im Klassendiagramm wird dieser Python-spezifische Zusatzparameter nicht aufgeführt.
Erzeugung von Objekten
Zur Erzeugung eines Objekts muss die Konstruktormethode der zugehörigen Klasse aufgerufen werden. In Python erreicht man dies, indem man den Klassennamen wie im folgenden Protokoll aufruft.
>>> ampel1 = Ampel()
>>> ampel1
<__main__.Ampel object at 0x0136C4B0>
>>> ampel1.__dict__
{'lampeRot': False, 'lampeGelb': False, 'lampeGruen': False}
Inspektion von Objekten
Das Protokoll zeigt auch, wie man sich in Python direkt einen Überblick über sämtliche Attribute und
Attributwerte eines Objekts verschafft. Mit einem Aufruf der Gestalt objekt.__dict__
erhält man den aktuellen Objektzustand.
Vernichtung von Objekten
Der Python-Dialog unten zeigt, wie man ein Objekt gezielt vernichten kann und somit eine Destruktormethode aktivieren kann. Python übernimmt das Vernichten von Objekten selbst, so dass wir uns in der Regel darum nicht kümmern müssen.
>>> ampel1 = Ampel()
>>> ampel1
<__main__.Ampel object at 0x0136C4B0>
>>> del ampel1
>>> ampel1
Traceback (most recent call last):
File ...
ampel1
NameError: name 'ampel1' is not defined
>>>