Objektorientierte Programmierung mit Python Polymorphismus und Vererbung Eltern Kind Kind Kind Kind
Prinzipien der objektorientierten Programmierung Vererbung Strukturierung von Klassen. Oberbegriffe beschreiben allgemeine Eigenschaften und Methoden eines Objekts. Spezielle Objekte erben die allgemeinen Eigenschaften und Methoden. Eltern-Kind-Beziehung. Polymorphie (Vielgestaltig): Geerbte Methoden werden an die speziellen Eigenschaften eines Objektes angepasst. Methoden sind in Abhängigkeit des Datentyps unterschiedlich implementiert. Objektorientierte Programmierung, 13.09.10 Seite 2
Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Implementierung von ist ein. bildet ein hierarchisches Modell ab. Das Modell sollte maximal drei Ebenen besitzen. Objektorientierte Programmierung, 13.09.10 Seite 3
Beispiel Konto GiroKonto - dispo : float - kontonummer : string - pinnummer : string +abheben(float betrag) +einzahlen(float betrag) +eroeffnen +schliessen FestgeldKonto - laufzeit : int - zins : float Objektorientierte Programmierung, 13.09.10 Seite 4
Darstellung der Vererbung Die Vererbung von Klassen kann mit Hilfe einer Baumstruktur abgebildet werden. Die Wurzel ist die Mutter aller Klassen. In Python wird die Klasse «object» genutzt. Darunter verzweigen sich die Klassen. Um so tiefer man eindringt, um so spezieller werden die Klassen. Um so näher man an der Wurzel ist, um so allgemeiner sind die Klassen. In der Vererbung werden gerichtete Beziehungen beschrieben. Ein Girokonto ist ein Konto. Ein Ballon ist ein Luftfahrzeug. Objektorientierte Programmierung, 13.09.10 Seite 5
Regeln Es werden alle Attribute und Methoden von der Basisklasse geerbt. Neue Attribute und Methoden können hinzufügt werden. Methoden aus der Basisklasse können überschrieben werden. Die Methoden aus der Basisklasse werden mit einer neuen Funktionalität versehen. Objektorientierte Programmierung, 13.09.10 Seite 6
Basis- und Subklassen Basisklasse Fahrzeuge Subklasse Land Wasser Luft Schiene Motorisiert Unmotorisiert Unmoterisiert Motorisiert Flugzeug Zeppelin Heißluftballon Objektorientierte Programmierung, 13.09.10 Seite 7
Subklasse (Unterklasse, abgeleitete Klasse)... erbt von der Basisklasse alle Attribute und Methoden. beschreibt die speziellen Elemente einer Klasse. ist von einer anderen Klasse abgeleitet. befindet sich in der Hierarchie unterhalb einer anderen Klasse. Objektorientierte Programmierung, 13.09.10 Seite 8
Basisklasse (Oberklasse, parent class)... ist der Ausgangspunkt für die Bildung von weiteren Klassen. implementiert Kategorien für Klassen. fasst Gemeinsamkeiten von verschiedenen Klassen zusammen. sortiert verschiedene Klassen in Schubladen ein. kann selber Subklasse einer anderen Basisklasse sein. Objektorientierte Programmierung, 13.09.10 Seite 9
Generalisierung und Spezialisierung Spezialisierung Fahrzeuge Generalisierung Land Wasser Luft Schiene Motorisiert Unmotorisiert Unmoterisiert Motorisiert Flugzeug Zeppelin Heißluftballon Objektorientierte Programmierung, 13.09.10 Seite 10
Generalisierung... sucht Gemeinsamkeiten aller Klassen in einer Projektbeschreibung. kategorisiert Klassen. nutzt die Bottom-Up-Methode. Die Klassen werden zuerst allgemein beschrieben und anschließend in Abhängigkeit der Aufgabe spezialisiert. Objektorientierte Programmierung, 13.09.10 Seite 11
Spezialisierung... beschreibt die Aktion erbt von. stellt eine ist eine -Beziehung dar. beschreibt exakt ein Objekt in einer Schublade. nutzt die Top-Down-Methode. Es werden zuerst alle benötigten Klassen in der Projektbeschreibung gesucht und implementiert. Anschließend werden Gemeinsamkeiten gesucht und diese in übergeordneten Klassen implementiert. Objektorientierte Programmierung, 13.09.10 Seite 12
Basisklasse in Python «class Grafik(object): ANZAHL = 0 def init (self, x = 0, y = 0): pass def set_pos(self, xpos, ypos): pass» def get_pos(self): pass Objektorientierte Programmierung, 13.09.10 Seite 13
Klassenkopf einer Basisklasse... «class Klassenname(object)». beginnt mit dem Schlüsselwort «class». Dem Schlüsselwort folgt der Klassenname. Der Klassenname... ist frei wählbar. identifiziert eindeutig eine Klasse. Am Ende des Kopfes folgt die Parameterliste, begrenzt durch die runden Klammern. Objektorientierte Programmierung, 13.09.10 Seite 14
Parameterliste «class Klassenname(object)». beginnt und endet mit den runden Klammern. enthält Namen von definierten Klassen. Die Elemente in der Liste werden durch Kommata getrennt. der Basisklasse ist leer oder sollte von «object» erben. Objektorientierte Programmierung, 13.09.10 Seite 15
Subklasse in Python «class Rechteck(Grafik): def init (self, breite = 10, hoehe = 20): Grafik. init (self, 0, 0) self. height = hoehe self. width = breite def set_groesse(self, breite, hoehe): pass» def get_groesse(self): pass Objektorientierte Programmierung, 13.09.10 Seite 16
Klassenkopf einer Subklasse... «class Klassenname(basisklasse, basisklasse)». beginnt mit dem Schlüsselwort «class». Dem Schlüsselwort folgt der Klassenname. Der Klassenname... ist frei wählbar. identifiziert eindeutig eine Klasse. Am Ende des Kopfes folgt die Parameterliste, begrenzt durch die runden Klammern. Objektorientierte Programmierung, 13.09.10 Seite 17
Parameterliste «class Klassenname(basisklasse, basisklasse)». beginnt und endet mit den runden Klammern. enthält Namen von definierten Klassen. Die Elemente in der Liste werden durch Kommata getrennt. Eine Mehrfachvererbung ist durch die Nennung von mehreren Klassen für eine Subklasse realisierbar. Die Subklasse basiert auf mehr als eine Klasse. Objektorientierte Programmierung, 13.09.10 Seite 18
Methoden aufrufen Methoden in der Subklasse: «[subklasse].[methode](arg01, arg02)» Methoden aus der Basisklasse: «[subklasse].[methode](arg01, arg02)» Die Methode wird der Klasse durch ein Punkt verbunden. Jeder Methode können mit Hilfe der Parameterliste verschiedenen Werte übergeben werden. Die Elemente in der Liste werden durch Kommata getrennt. Die angegebene Methode wird zuerst in der Subklasse gesucht. Falls sie dort nicht vorhanden ist, werden die Basisklassen in der, in der in der Parameterliste angegebenen Reihenfolge durchsucht. Objektorientierte Programmierung, 13.09.10 Seite 19
Beispiel «# Basisklasse class Grafik(object): def set_pos(self, xpos, ypos): pass def get_xpos(self): return self. xpos def write_pos(self): pass «# Subklasse class Grafik(object): def set_groesse(self, breite, hoehe): pass def get_groesse(self): pass def write_groesse(self): pass» mygrafik = modul.grafik(20,20) mygrafik.write_pos()()» myrechteckstandard = modul.rechteck() myrechteckstandard.write_pos() myrechteckstandard.write_groesse() Objektorientierte Programmierung, 13.09.10 Seite 20
Benutzerdefinierte Fehlerklasse «class clsmyerror(exception): fehlermeldung = {5000 : "Negative Zahl", 6000 : "Wert = 0"} def init (self, fehlernr): self.fehlernr = fehlernr» def getmeldung(self): return clsmyerror.fehlermeldung[self.fehlernr] Objektorientierte Programmierung, 13.09.10 Seite 21
Hinweise Benutzerdefinierte Fehlerklassen sollten immer von der vordefinierten Klasse «exception» erben. Der Programmierer kann die Fehlerklassen aber selber gestalten. Fehlerklassen sollten möglichst einfach sein. Objektorientierte Programmierung, 13.09.10 Seite 22
Nutzung von benutzerdefinierten Fehlerklasse «import fehler_class try: divident = float(strdivident) if (divident < 0): raise fehler_class.clsmyerror(5000) except fehler_class.clsmyerror as e: print(e.getmeldung())» Objektorientierte Programmierung, 13.09.10 Seite 23
Polymorphie (Vielgestaltigkeit, Ähnlichkeit) innerhalb einer Klasse: Nachbildung von mathematischen Operationen, Vergleichsoperationen etc, um die Funktionalität der Klasse an vordefinierte Klassen anzupassen. Überladung von Klassen. bei der Vererbung von Klassen: Die Subklasse überschreibt eine Methode der Basisklasse. Die Subklasse nutzt virtuelle Methoden. Objekte einer Subklasse, die alle die gleiche Basisklasse nutzen, reagieren auf ein und dieselbe Nachricht unterschiedlich. Objektorientierte Programmierung, 13.09.10 Seite 24
Methoden überschreiben Methoden aus der Basisklasse werden überdeckt. Geerbte Methoden werden mit einer neuen Funktionalität versehen. Die Methode aus der Basisklasse wird in der Subklasse neu definiert. Konstruktoren der Basisklassen werden häufig überschrieben. Objektorientierte Programmierung, 13.09.10 Seite 25
Konstruktor überschreiben «class Grafik(object): def init (self, x = 0, y = 0): self. xpos = x self. ypos = y» class Rechteck(Grafik): def init (self, breite = 10, hoehe = 20): Grafik. init (self, 0, 0) self. height = hoehe self. width = breite self. xposro = breite self. yposro = hoehe Objektorientierte Programmierung, 13.09.10 Seite 26
Konstruktor einer Subklasse «def init (self, breite = 10, hoehe = 20)». beginnt mit dem Schlüsselwort «def». hat immer den Namen «init» hat eine Parameterliste, die durch runde Klammern begrenzt wird. In dieser Parameterliste werden alle zu übergebenen Parameter aufgelistet. Die Listenelemente werden durch ein Kommata getrennt. ruft zuerst den Konstruktor der Basisklasse auf «Grafik. init (self, 0, 0)» und setzt anschließend die Objektattribute der Subklasse. Objektorientierte Programmierung, 13.09.10 Seite 27
Methode in der Basisklasse class Grafik(object): def set_pos(self, xpos, ypos): self. xpos = xpos self. ypos = ypos Objektorientierte Programmierung, 13.09.10 Seite 28
überschreiben «class Rechteck(Grafik): def set_pos(self, x_lo, y_lo, x_ro = 0, y_ro = 0): abstandx = self.get_xpos() - x_lo abstandy = self.get_ypos() - y_lo super().set_pos(x_lo, y_lo)» if (x_ro > 0): self. width = self. width + abstandx else: self. xposro = self.get_xpos() + self. width Objektorientierte Programmierung, 13.09.10 Seite 29
Zugriff auf Methoden der Basisklasse... mit Hilfe der Methode «super()»: Beispiel: «super().set_pos(x_lo, y_lo)». Arbeitet nur mit Basisklassen zusammen, die von «object» erben. Seit Python 2.2 ist die Methode implementiert. mit Hilfe des Namens: Beispiel: «Grafik. init (self, 0, 0)». Die Angabe des Objekts «self» wird immer benötigt. Objektorientierte Programmierung, 13.09.10 Seite 30
Operatoren überladen, um... Rechenoperatoren oder Vergleichsoperatoren für benutzerdefinierte Datentypen zu implementieren. Klassen mit einer Funktionalität ähnlich wie Standard- Datentypen auszustatten. Objektorientierte Programmierung, 13.09.10 Seite 31
Beispiel Das Pluszeichen kann eine Ganzzahl oder Dezimalzahl addieren. Das Pluszeichen wurde für Strings überladen. Das Pluszeichen verkettet zwei Strings. Objektorientierte Programmierung, 13.09.10 Seite 32
Operatoren in Python Umgangssprachliche Schreibweise: summe = a + b Der Operator definiert eine Verknüpfungsvorschrift. Formale Schreibweise: summe = add (a, b) Die Operatoren sind als Methoden implementiert. Der Methode «add» werden zwei Objekte übergeben. Das Ergebnis der Berechnung wird zurückgegeben. Objektorientierte Programmierung, 13.09.10 Seite 33
Addition neu definieren «class Rechteck(Grafik): def add (self, other): breite = self. width + other. width hoehe = self. height + other. height newrechteck = Rechteck(breite, hoehe)» return newrechteck Objektorientierte Programmierung, 13.09.10 Seite 34
Ist gleich neu definieren «class Rechteck(Grafik): def eq (self, other): proofx = self.get_xpos() == other.get_xpos() proofy = self.get_ypos() == other.get_ypos()» return (proofx and proofy) Objektorientierte Programmierung, 13.09.10 Seite 35
String definieren class Rechteck(Grafik): def str (self): ausgabe = "X-Position, oben links: " + str(self.get_xpos()) ausgabe = ausgabe + "\ny-position, oben links "+ str(self.get_ypos()) ausgabe = ausgabe + "\nx-position, unten rechts: "+ str(self. xposro) ausgabe = ausgabe + "\ny-position, unten rechts "+ str(self. yposro) return ausgabe Objektorientierte Programmierung, 13.09.10 Seite 36
Aufruf der überladenen Operatoren «RechteckGross = myrechteckstandard + Rechteck_Basisklasse.Rechteck(100, 100) print("position gleich? ", RechteckGross == RechteckPos)» print(rechteckgross) Objektorientierte Programmierung, 13.09.10 Seite 37