Objekte und Klassen

An dieser Stelle soll nochmal die Idee der objektorientierten Modellierung formuliert werden:

Unsere Umwelt besteht aus Objekten, welche Eigenschaften (Attribute) haben.

Mit Methoden lassen sich die Attributwerte von Objekten ändern. Außerdem können Objekte selbst Methoden ausführen.

Objekte mit gleichen Attributen und Methoden kann man zu Klassen zusammenfassen. Ein Objekt bezeichnet man in der Programmierung auch als Instanz einer Klasse.

In diesem Zusammenhang sollen noch einige Fachbegriffe erläutert werden:

Objekte besitzen einen Namen bzw. eine Bezeichnung.

Methoden können Parameter haben, mit denen zusätzliche Informationen übergeben werden.

Manche Methoden können Informationen über ein Objekt durch einen Rückgabewert (Ergebnis) zurückliefern.

Parameter und Rückgabewert haben einen bestimmten Datentyp. Der Typ bestimmt die Art der Werte die angenommen werden können. (z.B. Kommazahl, ganze Zahl, Text, Wahrheitswert, …)

Objekte (Instanzen einer Klasse) haben einen Zustand, der durch die Werte der Attribute (Attributwerte) bestimmt wird.

Objekte können miteinander kommunizieren, indem sie gegenseitig ihre Methoden aufrufen.

Das Ganze wollen wir nun in einem Beispiel betrachten:

Objekt: Volvo FL Gewicht: 12 Tonnen Leistung: 250 PS Farbe: blau Geschwindigkeit: 30 km/h	Objekt: MAN TGA Gewicht: 26 Tonnen Leistung: 480 PS Farbe: Gelb Geschwindigkeit: 0 km/h

Unsere beiden Objekte besitzen die Bezeichnungen „Volvo FL“ bzw. „MAN TGA“. Beide Objekte besitzen die Attribute Gewicht, Leistung, Farbe und Geschwindigkeit, allerdings mit unterschiedlichen Attributwerten. Die Objekte besitzen somit unterschiedliche Zustände (z.B. fährt einer der LKW und der andere steht).

Weiterhin besitzen die Objekte Methoden: lackieren(farbe) und geschwindigkeitAendern(wert). Mit den Parametern „farbe“ und „wert“ können den Methoden Werte übergeben werden. Die Methode Geschwindigkeit addiert den übergebenen Wert zur aktuellen Geschwindigkeit und gibt dann die neue Geschwindigkeit zurück. Sie besitzt also einen Rückgabewert.

Die Parameter bzw. die Rückgabewerte besitzen unterschiedliche Datentypen. So besitzen z.B. der Parameter „wert“ und der Rückgabewert der Methode geschwindigkeitAendern(wert) den Datentyp int und der Parameter „farbe“ der Methode lackieren(farbe) den Datentyp str. Auch die Attribute besitzen unterschiedliche Datentypen: Gewicht:int, Leistung :int, Farbe:str und Geschwindigkeit:int.

Objekte mit gleichen Attributen und Methoden lassen sich zu einer Klasse zusammenfassen. In unserem Fall würde sich eine Klasse LKW mit den Attributen Gewicht, Leistung, Farbe, Geschwindigkeit und mit den Methoden geschwindigkeitAendern(wert) und lackieren(farbe) anbieten.

UML

UML (Unified Modeling Language) ist eine grafische Modellierungssprache mit der die Zusammenhänge zwischen Klassen und Objekten dargestellt werden können. Mit dem entsprechendem Programm kann man sogar die grafischen Klassen in einer beliebigen Programmiersprache exportieren. Wir wollen uns mit einer vereinfachten Version von UML beschäftigen.

Unsere Klasse und unsere beiden Objekte würden in UML so aussehen:

Klassen werden in UML als Rechtecke dargestellt. In dem Rechteck werden der Bezeichner der Klasse, die Attribute und die Methoden vermerkt. Alternativ können noch die Datentypen der Attribute, der Parameter und der Rückgabewerte der Methoden vermerkt werden.

Objekte werden in UML als abgerundete Rechtecke (Objektkarten) dargestellt. Zum Bezeichner schreibt man die Klasse, zu der das Objekt gehört. Zu den Attributen schreibt man die zugehörigen Attributwerte. Die Methoden lässt man weg. Objekte werden in UML nur in der Schule bei verwendet. Bei der professionellen Programmierung spielen sie keine Rolle.

Erstellung von UML-Diagrammen mit Dia

Mit der freien Software Dia lassen sich recht gut UML-Diagramme erstellen. Dies wird im folgenden Video am Beispiel der Klasse LKW demonstriert.

Download von Dia bei Heise

Klassen in Python

Der folgende Quelltext setzt die Klasse LKW in Python um. An ihr soll das Erstellen und Verwenden von Klassen in Python erläutert werden.

# Definition einer Klasse LKW class LKW: # Attribute der Klasse bezeichnung="" gewicht=0 leistung=0 farbe="" geschwindigkeit=0 # Methoden der Klasse def __init__(self, bezeichnung, gewicht, leistung, farbe, geschwindigkeit): # Konstruktor self.bezeichnung = bezeichnung self.gewicht = gewicht self.leistung = leistung self.farbe = farbe self.geschwindigkeit = geschwindigkeit def geschwindigkeitAendern(self, wert): self.geschwindigkeit += wert return self.geschwindigkeit def lackieren(self, farbe): self.farbe = farbe def ausgabe(self): print("LKW") print("Bezeichnung:",self.bezeichnung) print("Gewicht:", self.gewicht,"t") print("Leistung:", self.leistung,"PS") print("Farbe:", self.farbe) print("Geschwindigkeit:", self.geschwindigkeit,"km/h") # Hauptprogramm # Instanzen der Klasse LKW, Objekte werden erzeugt volvo = LKW("Volvo FL",12,240,"blau",30) man = LKW("MAN TGA",26 ,480,"gelb",0) # Für die Objekte wird die Methode ausgabe() ausgeführt volvo.ausgabe() print() man.ausgabe() # Die Geschwindigkeit des Volvo und die Farbe des MAN werden geändert. volvo.geschwindigkeitAendern(50) man.lackieren("rot") # Die Objekte werden erneut ausgegeben print() volvo.ausgabe() print() man.ausgabe()

Die Definition einer Klasse beginnt mit dem Schlüsselwort class, gefolgt vom Klassennamen. Danach steht ein Doppelpunkt. Der gesamte Quelltext, der nach dem Doppelpunkt eingerückt ist gehört zur Klasse.

Danach werden im Bereich # Attribute der Klasse die Klassenattribute definiert. Jede Variable die innerhalb der Klasse definiert wird ist eine Klassenvariable. Alle verwendeten Klassenvariablen sollten an dieser Stelle mit sinnvollen Werten belegt werden. Im Unterschied zum Klassendiagramm habe ich ein zusätzliches Attribut bezeichnung eingeführt

Im Bereich # Methoden der Klasse werden die Klassenmethoden definiert. Eine Methodendefinition beginnt genau wie eine Funktionsdefinition mit dem Schlüsselwort def Im Unterschied zu einer Funktionsdefinition enthält sie aber immer den Parameter self zusätzlich zu den übrigen Parametern.

Die erste Methode ist der sogenannte Konstruktor. In Python bekommt er den Namen __init__(self...) (Beachte: Vor und nach init stehen jeweils zwei Unterstriche). Der Konstruktor wird beim erstellen der Klasse aufgerufen. Dabei werden an die Klassenvariablen (Attribute) sinnvolle Werte übergeben. Damit man auf die Klassenvariablen zugreifen kann, muss vor dem Variablennamen das Schlüsselwort self stehen, sonst erzeugt man einfach lokale Variablen.

Mit der Methode geschwindigkeitAendern(self, wert) wird zum Attribut geschwindigkeit ein Wert addiert bzw. subtrahiert.

Mit der Methode lackieren(self, farbe) wird das Attribut farbe geändert.

Mit der Methode ausgabe(self) werden alle Attribute der Klasse mit ihren Werten ausgegeben.

Im Hauptprogramm werden mit

volvo = LKW("Volvo FL",12,240,"blau",30) man = LKW("MAN TGA",26 ,480,"gelb",0)

zwei Objekte (Instanzen) der Klasse erzeugt. Dabei wird der Konstruktor (__init__(self...)) der Klasse aufgerufen und die Attribute werden mit den entsprechenden Werten belegt. In der Parameterliste fehlt jetzt das self.

Danach folgen einige Methodenaufrufe. Um die Methoden für ein Objekt aufzurufen, schreibt man den Objektnamen, danach einen Punkt und den Methodennamen. In der Parameterliste fehlt wieder das self.

Erklärvideo zum Erstellen der Klasse:

Aufgaben

Aufgabe 1

Erstelle ein Klassendiagramm wie im Video der Klasse LKW mit Dia! (Alternativ kann auch LibreOffice-Draw oder ein anderes Vektorgrafikprogramm genutzt werden. Das Diagramm kann auch per Hand gezeichnet werden.)

Aufgabe 2

Gegeben sind die folgenden Beschreibungen von Klassen:

Smartphones haben einen Preis, eine Bezeichnung und eine Displayauflösung. Sie können klingeln Videos abspielen.

Uhren haben eine Armbandlänge und eine Farbe. Sie können die Zeit anzeigen, ticken und man kann den Wecker stellen.

Schuhe haben eine Farbe, eine Größe und eine Bezeichnung. Man kann sie anziehen und putzen.

Erstelle jeweils ein Klassendiagramm mit Dia! (Alternativ kann auch LibreOffice-Draw oder ein anderes Vektorgrafikprogramm genutzt werden. Das Diagramm kann auch per Hand gezeichnet werden.)

Aufgabe 3

Programmiere entsprechend dem Erklärvideo die Klasse „LKW“ nach.

Aufgabe 4

Programmiere entsprechend deiner Klassendiagramme aus Aufgabe 2 die Klassen „Smartphone“, „Uhr“ und „Schuhe“, Ergänze die Klassen entsprechend der Klasse LKW jeweils um das Attribut bezeichnung, um den Konstruktur und um eine Methode ausgabe(self). Teste die Klasse durch Anlegen einiger Instanzen und durch aufrufen der Klassenmethoden.

Aufgabe 5

Gegeben ist das UML-Programm einer Klasse Katze: