Python - Objektorientierte Programmierung

Werbung
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
Herunterladen