====== 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 {{ :python:obj:volvo.png?direct&200 |}} * Gewicht: 12 Tonnen * Leistung: 250 PS * Farbe: blau * Geschwindigkeit: 30 km/h **Objekt:** MAN TGA {{ :python:obj:man.png?direct&180 |}} * 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: {{ :python:obj:uml.png?direct&600 |}} 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. {{youtube>0_lZWnwcza0}} * [[https://www.heise.de/download/product/dia-43176|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: ==== {{youtube>xyHhYwW3ERg}} \\ ===== 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: {{ :python:obj:katze.png?400 |}} Erstelle die Klasse in Python. Lass dir für die Methoden sinnvollen Quelltext einfallen. Lege einige Objekte der Klasse an und teste die Methoden. Lass dir eventuell weitere sinnvolle Methoden einfallen. [[python:loesungen:obj:klassen| >> Lösungen]] [[python:obj:vererb| >> Vererbung]] \\ ~~DISCUSSION | Hier können Fragen zum Inhalt der Seite gestellt werden. ~~