Python „Vererbung“ Personen Kunden Mitarbeiter Verwaltung Anja Aue | 13.09.16 Verkäufer Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Ableitung einer Klasse von einer anderen. Abbildung von Klassen in einem hierarchischen Modell. Eltern-Kind-Beziehung. Implementierung von „ist ein“-Beziehungen. Programmiersprache Python Seite 2 Basisklasse Oberklasse, Elternklasse, Superklasse. Allgemeine Beschreibung einer Gruppe von Objekten. Weitergabe von Attributen und Methoden. Programmiersprache Python Seite 3 Basisklasse „Person“ Person Vorname Nachname Straße Postleitzahl Ort Lese Info Briefkopf Setze Nachname Programmiersprache Python Seite 4 beispiel\kapitel09_KlassenVererbunge\basisklasse.py … in Python class ClsPerson: def __init__(self, nachname, anrede, vorname = ""): self.anrede = anrede self.vorname = vorname self.nachname = nachname self.oldNachname = "" def getPersonInfo(self): personName = self.nachname if self.vorname != "": personName = self.vorname + " " + self.nachname return personName Programmiersprache Python Seite 5 Aufbau class ClsPerson: def __init__(self, nachname, anrede, vorname = ""): self.anrede = anrede self.vorname = vorname self.nachname = nachname self.oldNachname = "" Klassenkopf Klassenrumpf def getPersonInfo(self): pass Programmiersprache Python Seite 6 … erbt von der Standardklasse „object“ class ClsPerson ( object ) : „new-style-class“. Alle Klassen in Python erben Attribute und Methoden von der Klasse object. C++ - Objektorientierte Programmierung | 06.05.15 Seite 7 Aufbau des Klassenkopfs class ClsPerson ( object ) : Der Klassenkopf beginnt mit dem Schlüsselwort class. Dem Klassennamen folgt eine beliebige Bezeichnung. Die Bezeichnung sollte den realen Gegenstand abbilden. Dem Klassennamen folgen runde Klammern. In den runden Klammern werden alle Basisklassen der Klasse, getrennt durch Kommata, aufgelistet. Dem Klassennamen folgt der Doppelpunkt. C++ - Objektorientierte Programmierung | 06.05.15 Seite 8 Subklasse Unterklasse, Kindklasse. Eltern-Kind-Beziehung. Abgeleitete Klasse von ein oder mehreren Basisklassen. Erweiterung oder Spezialisierung der Basisklasse. Programmiersprache Python Seite 9 Subklassen Person Person Vorname Nachname Vorname Straße Nachname Postleitzahl Ort Straße Person Mitarbeiter Vorname Nachname Straße Postleitzahl Ort Gehalt Postleitzahl Setze Personname Lese Personname Ort Setze Adresse Lese Adresse Lese Info Briefkopf Setze Nachname Programmiersprache Python Lese Gehalt Setze Gehalt fest Seite 10 Abbildung als hierarchisches Modell Attribute Methoden Mitarbeiter Kunde Attribute Attribute Methoden Methoden Programmiersprache Python Spezialisierung Generalisierung Person Seite 11 Generalisierung Von den Blättern zur Wurzel. Um so höher man kommt, um so allgemeiner werden die Attribute und Methoden der Klasse. Klassen werden zu „Oberbegriffen“ zusammengefasst, die die einzelnen Klassen generell beschreiben. Programmiersprache Python Seite 12 Spezialisierung Von der Wurzel zu den Blättern. Um so tiefer man kommt, um so spezieller werden die Attribute der Klasse. Die Klassen beschreiben Spezialfälle eines Oberbegriffs. Details einer Objektgruppe werden detailliert beschrieben. Programmiersprache Python Seite 13 Subklasse in Python beispiel\kapitel09_KlassenVererbunge\subklasse.py import basisklasse class ClsMitarbeiter(basisklasse.ClsPerson): def __init__(self, nachname, anrede, vorname = "", gehalt = 1200): super().__init__(nachname, anrede, vorname) self.gehalt = gehalt def getGehalt(self): return self.gehalt def setGehalt(self, gehalt): self.gehalt = gehalt Programmiersprache Python Seite 14 Import der Basisklasse import basisklasse Die Basisklasse ist in einem Modul gespeichert. Das Modul ist eine Codedatei mit der Endung „.py“. Mit Hilfe des Schlüsselwortes import wird diese Datei eingebunden. Der Interpreter von Python sucht den Dateinamen zuerst in dem momentan aktuellen Verzeichnis der Subklasse. Programmiersprache Python Seite 15 Klassenkopf der Subklasse class ClsMitarbeiter ( basisklasse.ClsPerson ) : Der Klassenkopf beginnt mit dem Schlüsselwort class. Dem Klassennamen folgt eine beliebige Bezeichnung. Die Bezeichnung sollte den realen Gegenstand abbilden. Dem Klassennamen folgen runde Klammern. In den runden Klammern werden alle Basisklassen der Klasse, getrennt durch Kommata, aufgelistet. Dem Klassennamen folgt der Doppelpunkt. C++ - Objektorientierte Programmierung | 06.05.15 Seite 16 Angabe der Basisklasse basisklasse. . ClsPerson namespace . elment Die Basisklasse wird mit Hilfe eines qualifizierten Namens angegeben. Links vom Punktoperator wird das Modul angegeben, in dem die gewünschte Basisklasse definiert ist. Rechts vom Punktoperator steht der Name der Basisklasse. Von dieser Klasse erbt die Subklasse. Programmiersprache Python Seite 17 Erzeugung der Subklasse mitarbeiter = ClsMitarbeiter(nachname="nachname", anrede = "Frau", gehalt=2300) Der Instanz mitarbeiter verweist auf ein Objekt vom Typ ClsMitarbeiter. In den runden Klammern werden Werte zur Initialisierung von Objektattributen übergeben. Programmiersprache Python Seite 18 Initialisierungsmethode def __init__(self, nachname, anrede, vorname = "", Gehalt = 1200): super().__init__(nachname, anrede, vorname) self.gehalt = gehalt Programmiersprache Python Seite 19 Methodenkopf def __init__(self, nachname, anrede, vorname = "", Gehalt = 1200): pass Mit Hilfe des Schlüsselwortes def beginnt die Initialisierungsmethode. Die Methode hat immer den Namen __init__. In den runden Klammern wird eine Liste von Parametern definiert. Der Methodenkopf endet mit dem Doppelpunkt. Programmiersprache Python Seite 20 Methodenrumpf def __init__(self, nachname, anrede, vorname = "", Gehalt = 1200): super().__init__(nachname, anrede, vorname) self.gehalt = gehalt Im Methodenrumpf wird zuerst die Basisklasse initialisiert. Anschließend werden alle Objektattribute der Subklasse definiert. Programmiersprache Python Seite 21 Aufruf des Basisklassen-Initialisierer basisklasse.ClsPerson.__init__(self, nachname, anrede, vorname) Die Methode __init__ der Basisklasse wird mit Hilfe eines qualifizierten Namens in der Form Modul.Basisklasse.Methode aufgerufen. Dem qualifizierten Namen folgt die Parameterliste. Der erste Parameter self in der Basisklasse verweist auf den Aufrufer der Initialisierungsmethode. Programmiersprache Python Seite 22 … kann ab Python 3.x ersetzt werden durch... super().__init__(nachname, anrede, vorname) Die Funktion super() liefert ein Verweis auf die Basisklasse zurück. Zu der Basisklasse wird die Initialisierungsmethode __init__ aufgerufen. Programmiersprache Python Seite 23 Weitere Möglichkeit super(ClsMitarbeiter, self).__init__(nachname, anrede, vorname) Die Funktion super() liefert ein Verweis auf die Basisklasse zurück. Diese Art der Nutzung der Funktion ist kompatibel zu Python 2.x. Der Funktion wird als erstes Argument der Name einer Subklasse übergeben. Zu dieser Subklasse wird die Basisklasse gesucht. Ein Hinweis auf den Aufrufer wird im zweiten Argument übergeben. Die Nutzbarkeit von self wird durch die Basisklasse erweitert. Programmiersprache Python Seite 24 Aufruf von Methoden mitarbeiter.getPersonInfo() mitarbeiter.getGehalt() Der Punktoperator verbindet die Instanz mit der Methode. In den runden Klammern können der Methode Argumente übergeben werden. In diesem Beispiel werden beiden Methoden keine Argumente übergeben. Falls die Methode nicht in der Subklasse vorhanden ist, wird in der Basisklasse gesucht. Programmiersprache Python Seite 25 Methode aus der Basisklasse class ClsPerson: def getPersonInfo(self): personName = self.nachname if self.vorname != "": personName = self.vorname + " " + self.nachname return personName Programmiersprache Python Seite 26 … in der Subklasse überschreiben def getPersonInfo(self): personName = self.nachname ausgabe = "" if self.vorname != "": personName = self.vorname + " " + self.nachname if self.abteilung != "": ausgabe = "beschäftigt in der Abteilung " + self.abteilung ausgabe = personName + '\n' + ausgabe return ausgabe Programmiersprache Python Seite 27 Erläuterung def def basisklasse.getPersonInfo ( self ) : subklasse.getPersonInfo ( self, showGeburtsinfo = False ) : Die zu überschriebene Methode in der Basisklasse und die dazugehörige Methode in der Subklasse haben den gleichen Namen. Die Parameterliste der Methode in der Subklasse hat mindestens so viele Parameter wie die zu überschreibende Methode, Die Parameterliste kann erweitert werden. Programmiersprache Python Seite 28 Abstrakte Klassen Vorlage für für Subklassen. Basisklasse, von der keine Instanz erzeugt werden kann. Beschreibung eines Oberbegriffes. Ein Mitarbeiter oder Kunde ist auch immer eine Person. Implementierung der Generalisierung von Klassen. Programmiersprache Python Seite 29 beispiel\kapitel09_KlassenVererbunge\abstract_basisklasse.py … in Python import abc class ClsPerson(metaclass = abc.ABCMeta): def __init__(self, nachname, anrede, vorname = ""): self.anrede = anrede self.vorname = vorname self.nachname = nachname @abc.abstractmethod def getPersonInfo(self): pass @abc.abstractmethod def getBriefkopf(self): pass Programmiersprache Python Seite 30 Import des Moduls „Abstract Base Class“ import abc Definition einer abstrakten Basisklasse in Python. Programmiersprache Python Seite 31 Abstrakte Klasse class ClsPerson ( metaclass = abc.ABCMeta ) : Metaklassen sind Klassen, deren Klassen wiederum Klassen sind. In diesem Beispiel wird um eine abstrakte Klasse zu erzeugen abc.ABCMeta genutzt. Abstrakte Klassen besitzen mindestens eine abstrakte Methode. Von einer abstrakten Klasse kann kein Objekt erzeugt werden. C++ - Objektorientierte Programmierung | 06.05.15 Seite 32 Abstrakte Methode @abc.abstractmethod def getPersonInfo(self): pass In der Zeile vor dem Methodenkopf wird die Anweisung @abc.abstractmethod eingefügt. Der Kopf der Methode wird definiert. Der Methodenrumpf ist leer. Abstrakte Methoden müssen von der Subklasse implementiert werden. Programmiersprache Python Seite 33