Klassen erstellen und Objekte definieren - RRZN
Klassen erstellen und Objekte definieren - RRZN
Klassen erstellen und Objekte definieren - RRZN
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Objektorientierte Programmierung mit Python –<br />
Objekt <strong>und</strong> <strong>Klassen</strong><br />
… hat Kanten<br />
… hat eine Farbe<br />
… hat eine Kantenfarbe<br />
Rechteck zeichnen<br />
Rechteck einfärben<br />
Rechteck drehen
Modulare Programmierung<br />
<br />
<br />
<br />
Eine Aufgabe wird in viele kleine Aufgaben zerlegt.<br />
Jede kleine Aufgabe ist in sich abgeschlossen. Die Aufgabe<br />
kann von einem Entwickler-Team unabhängig von allen<br />
anderen programmiert werden.<br />
Jede kleine Aufgabe ist in einer Datei abgelegt. In dieser Datei<br />
werden die verschiedenen Aktionen in Funktionen abgelegt.<br />
Jede Funktion wiederum kann für sich allein getestet werden.<br />
Objektorientierte Programmierung, 09.09.10 Seite 2
Beispiel<br />
start.py<br />
def Main():<br />
Anweisungen<br />
rechenoperationen.py<br />
def Addition(...):<br />
Anweisungen<br />
def Subtraktion(...):<br />
Anweisungen<br />
eingabeBildschirm.py<br />
def Eingabe():<br />
Anweisungen<br />
Objektorientierte Programmierung, 09.09.10 Seite 3
Objektorientierte Programmierung ...<br />
<br />
<br />
<br />
abstrahiert Gegenstände der realen Wert, um sie in einem<br />
Programm abzubilden.<br />
beschreibt <strong>Objekte</strong> <strong>und</strong> verändert diese.<br />
versucht Daten <strong>und</strong> Funktionen eines Objekts in einer Struktur<br />
zu kapseln. Die Daten beschreiben das Objekt. Funktionen<br />
verändern die Attributwerte eines Objekts.<br />
Objektorientierte Programmierung, 09.09.10 Seite 4
Beispiel<br />
Füllfarbe<br />
Rechteck<br />
zeichnen<br />
Breite / Länge<br />
x- / y-Position<br />
Kantenfarbe<br />
Rechteck<br />
Rechteck<br />
verschieben<br />
Rechteck<br />
füllen<br />
Attribute (Variablen)<br />
Aktionen (Funktionen)<br />
Objektorientierte Programmierung, 09.09.10 Seite 5
Prinzipien der objektorientierten Programmierung<br />
<br />
<br />
Abstraktion<br />
<strong>Objekte</strong> der realen Welt werden nachgebildet.<br />
Es werden nur die, für die Aufgabe des Projekts benötigten<br />
Elemente abgebildet.<br />
Datenkapselung:<br />
Für Außenstehende ist das Objekt eine Black Box.<br />
Variablen <strong>und</strong> die dazugehörigen Funktionen werden<br />
zusammengefasst.<br />
In dieser Black Box wird mit Hilfe von Variablen das Objekt<br />
beschrieben.<br />
Funktionen verändern die Variablen eines Objekts. Wie sie<br />
aber die Attribute verändern, ist dem Nutzer nicht bekannt.<br />
Objektorientierte Programmierung, 09.09.10 Seite 6
<strong>Objekte</strong> ...<br />
<br />
<br />
<br />
<br />
beschreiben einen Gegenstand, Person etc. aus der realen<br />
Welt.<br />
sind Substantive in einem Text.<br />
haben Attribute (Eigenschaften), die das Aussehen des Objekts<br />
beschreiben.<br />
haben Methoden, die die Attribute verändern. Methoden<br />
spiegeln das Verhalten eines Objekts wieder.<br />
Objektorientierte Programmierung, 09.09.10 Seite 7
Beispiel<br />
<br />
Ein Würfel wird beschrieben:<br />
Der Würfel ist rot.<br />
Der Würfel hat eine Kantenlänge von 5 cm.<br />
Der Würfel kann gedreht werden.<br />
Der Würfel kann neu eingefärbt werden.<br />
Objektorientierte Programmierung, 09.09.10 Seite 8
… <strong>und</strong> in Python<br />
„Everything is a object“. In Python ist jedes Element ein Objekt.<br />
<strong>Objekte</strong> in Python ...<br />
können Variablen (Attribute) <strong>und</strong> Funktionen (Methoden)<br />
haben, müssen aber nicht.<br />
sind an einen bestimmten Datentyp geb<strong>und</strong>en.<br />
können an Funktionen übergeben werden.<br />
werden mit Hilfe von <strong>Klassen</strong> beschrieben.<br />
werden mit speziellen Methoden erzeugt <strong>und</strong> initialisiert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 9
Beispiel: Funktion <strong>definieren</strong> <strong>und</strong> aufrufen<br />
«<br />
def Addition(zahlL, zahlR):<br />
return (zahlL + zahlR)<br />
»<br />
summe = Addition(3, 5)<br />
print("Addition(3, 5): ", summe)<br />
Objektorientierte Programmierung, 09.09.10 Seite 10
Beispiel: Funktion als Rückgabewert nutzen<br />
«<br />
def Addition(zahlL, zahlR):<br />
return (zahlL + zahlR)<br />
def FunctionXYZ(arg01, arg02):<br />
return Addition(arg01, arg02)<br />
»<br />
summe = FunctionXYZ(3, 5)<br />
print("FunctionXYZ(3, 5): ", summe)<br />
Objektorientierte Programmierung, 09.09.10 Seite 11
Beispiel: Funktion als Parameter nutzen<br />
«<br />
def Addition(zahlL, zahlR):<br />
return (zahlL + zahlR)<br />
def FuncAsArgument(myFunction, arg01, arg02):<br />
return (myFunction(arg01, arg02))<br />
»<br />
summe = FuncAsArgument(Addition, 3, 5)<br />
print("funcAsArgument(Addition, 3, 5) : ", summe)<br />
Objektorientierte Programmierung, 09.09.10 Seite 12
Beispiel: Alias für eine Funktion<br />
«<br />
def Addition(zahlL, zahlR):<br />
return (zahlL + zahlR)<br />
»<br />
myAddition = Addition<br />
summe = myAddition(3,5)<br />
print("myAddition(3,5) : ", summe)<br />
Objektorientierte Programmierung, 09.09.10 Seite 13
<strong>Klassen</strong> ...<br />
<br />
<br />
<br />
<br />
<br />
<br />
sind Baupläne, um bestimmte Objekt zu beschreiben.<br />
abstrahieren das Aussehen <strong>und</strong> Verhalten eines bestimmten<br />
Objekttyps.<br />
bieten eine Schablone, um <strong>Objekte</strong> abstrakt zu beschreiben.<br />
<strong>definieren</strong> Eigenschaften (Attribute) <strong>und</strong> Methoden, die alle<br />
<strong>Objekte</strong> eines bestimmten Typs besitzen.<br />
sind formale Beschreibungen für <strong>Objekte</strong> in einer bestimmten<br />
Programmiersprache.<br />
sind das Rezept, um ein bestimmtes Gericht herzustellen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 14
Beispiel<br />
<br />
<br />
Welche Eigenschaften hat jeder Würfel?<br />
Farbe.<br />
Kantenlänge<br />
Welche Methoden hat jeder Würfel?<br />
Drehen.<br />
Einfärben.<br />
Zeichnen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 15
Beschreibung mit Hilfe von UML<br />
<br />
<br />
<br />
<br />
Unified Modelling Language zur<br />
Darstellung von <strong>Klassen</strong> etc.<br />
Der Name der Klasse steht am<br />
oberen Rand.<br />
Dem Namen folgen die Attribute<br />
der Klasse <strong>und</strong> darunter die<br />
Methoden.<br />
In UML werden private<br />
Methoden <strong>und</strong> Attribute mit<br />
einem Minuszeichen <strong>und</strong><br />
öffentliche Attribute <strong>und</strong><br />
Methoden mit einem<br />
Pluszeichen gekennzeichnet.<br />
Wuerfel<br />
- farbe : string<br />
- kante: double<br />
+get_Farbe() : string<br />
+get_Laenge() : float<br />
+set_Farbe() : string<br />
+set_Laenge(): float<br />
+drehen_Wuerfel() : void<br />
Objektorientierte Programmierung, 09.09.10 Seite 16
… <strong>und</strong> in Python<br />
«<br />
class Rechteck(object):<br />
anzahl = 0<br />
farbeKante = "Black"<br />
farbeFuellung = "White"<br />
def __init__(self, paraBreite = 10, paraHoehe = 10):<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
»<br />
def setPos(self, xPos, yPos):<br />
self.xPos = xPos<br />
self.yPos = yPos<br />
Objektorientierte Programmierung, 09.09.10 Seite 17
<strong>Klassen</strong>kopf<br />
« class Rechteck(object): »<br />
Jede Klasse beginnt mit dem Schlüsselwort « class ».<br />
<br />
<br />
<br />
Dem Schlüsselwort folgt der Name der Klasse. Der Name ist<br />
frei wählbar.<br />
In den r<strong>und</strong>en Klammern wird die Basisklasse « object » an die<br />
Klasse übergeben.<br />
Die Deklaration endet mit einem Doppelpunkt.<br />
Objektorientierte Programmierung, 09.09.10 Seite 18
Regeln für <strong>Klassen</strong>namen<br />
<br />
<br />
<br />
<br />
Es können die Buchstaben a...z, A...Z, die Zahlen 0...9 sowie<br />
der Unterstrich genutzt werden.<br />
<strong>Klassen</strong>namen beginnen mit einem Großbuchstaben.<br />
Häufig haben <strong>Klassen</strong>namen das Präfix „C“, um sie von<br />
anderen Elementen in Python zu unterscheiden.<br />
Unterscheidung zwischen Groß- <strong>und</strong> Kleinschreibung. Die<br />
Bezeichnungen c_rechteck <strong>und</strong> C_Rechteck bezeichnen<br />
unterschiedliche <strong>Klassen</strong>.<br />
Objektorientierte Programmierung, 09.09.10 Seite 19
Weitere Hinweise<br />
<br />
<br />
<br />
<br />
<br />
Nutzen Sie aussagekräftige Namen.<br />
Der Oberbegriff aus der realen Welt sollte auch für die<br />
dazugehörige Klasse in Python genutzt werden.<br />
Jedes Teilwort eines <strong>Klassen</strong>namen beginnt mit mit einem<br />
Großbuchstaben.<br />
Es sollte nur ein Sprachraum genutzt. In einer Datei werden nur<br />
englischsprachige oder nur deutschsprachige Bezeichnungen<br />
genutzt. Englischsprachige Begriffe sollten aber nicht mit aller<br />
Macht übersetzt werden, wenn sie allgemein verständlich sind.<br />
Schlüsselwörter der Programmiersprache Python dürfen nicht<br />
genutzt werden.<br />
Objektorientierte Programmierung, 09.09.10 Seite 20
… in einer Projektbeschreibung<br />
<br />
<br />
<strong>Klassen</strong> entsprechen Substantiven in einer<br />
Projektbeschreibung.<br />
Das Konto wird für den Inhaber xyz von der Bank a eröffnet.<br />
Das Auto HI hat den Besitzer xyz.<br />
Mitarbeiter Müller arbeitet an dem Projekt „Ausschreibung“.<br />
Die Bestellung wird über einen Laserdrucker xyz<br />
ausgedruckt.<br />
Außendienstmitarbeiter Meier betreut K<strong>und</strong>en im Bezirk<br />
Unterweser.<br />
Red<strong>und</strong>ante oder für die Aufgabenstellung unnötige <strong>Klassen</strong><br />
werden nicht implementiert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 21
Basisklasse als Argument<br />
« class Rechteck(object): ».<br />
<br />
<br />
<br />
<br />
In den r<strong>und</strong>en Klammern wird der benutzerdefinierten Klasse<br />
eine Basisklasse übergeben.<br />
Die Basisklasse …<br />
ist die Eltern-Klasse der benutzerdefinierten Klasse.<br />
ist die übergeordnete Klasse.<br />
beschreibt die Klasse allgemein.<br />
Als Basisklasse wird standardmäßig die vordefinierte Klasse<br />
« object » genutzt.<br />
Die r<strong>und</strong>en Klammern können leer sein.<br />
Objektorientierte Programmierung, 09.09.10 Seite 22
Grafische Darstellung<br />
object<br />
list<br />
MyList<br />
dic<br />
classRechteck<br />
Objektorientierte Programmierung, 09.09.10 Seite 23
<strong>Klassen</strong>rumpf ...<br />
<br />
<br />
<br />
<br />
<br />
folgt nach dem Doppelpunkt des <strong>Klassen</strong>kopfes.<br />
kann nur aus der leeren Anweisungen « class » bestehen.<br />
definiert Attribute, die von allen <strong>Objekte</strong>n einer Klasse<br />
gemeinsam genutzt werden.<br />
definiert Methoden, um die Attribute, die jedes Objekt hat, zu<br />
verändern.<br />
definiert eine Initialisierungsmethode für <strong>Objekte</strong> einer<br />
bestimmten Klasse.<br />
Objektorientierte Programmierung, 09.09.10 Seite 24
Eine Instanz ...<br />
<br />
<br />
<br />
<br />
<br />
ist eine Variable vom Datentyp „Klasse“.<br />
verweist auf ein bestimmtes Objekt einer bestimmten<br />
Kategorie.<br />
ist ein Synonym für ein Objekt. Das Objekt ist vom Typ der<br />
angegebenen Klasse.<br />
ist das mit Hilfe eines Rezept erstellte, fertige Gericht.<br />
kann beliebig oft von einer Klasse erzeugt werden.<br />
Objektorientierte Programmierung, 09.09.10 Seite 25
… erzeugen<br />
«<br />
»<br />
RechteckBlau = classRechteck.Rechteck()<br />
RechteckGruen = classRechteck.Rechteck(20,30)<br />
In diesem Beispiel wird die Instanz « RechteckBlau » erzeugt.<br />
Die Instanz verweist auf ein Objekt von der Klasse « Rechteck ».<br />
Die Klasse selber ist in dem Modul « classRechteck »<br />
implementiert. <strong>Klassen</strong> <strong>und</strong> deren Aufruf werden häufig in<br />
verschiedenen Dateien gespeichert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 26
Ablauf<br />
<br />
<br />
<br />
Zuerst wird das Objekt mit der Methode « __new__ » erzeugt.<br />
Anschließend werden mit Hilfe der Methode « __init__ » mit<br />
Standardwerten initialisiert.<br />
Zum Schluss wird die Referenz auf das Objekt in der<br />
Instanzvariablen « RechteckBlau » gespeichert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 27
Instanz zerstören<br />
« del RechteckBlau ».<br />
<br />
<br />
<br />
Die Instanz wird aus dem Speicher entfernt.<br />
Nach der Löschung ist die Instanz <strong>und</strong>efiniert.<br />
Falls keine weitere Instanz von einer Klasse vorhanden ist, wird<br />
die Methode « __del__ » aufgerufen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 28
Attribute (Member) ...<br />
<br />
<br />
<br />
<br />
beschreiben einen Gegenstand, Person, Funktion etc.<br />
Jedes Objekt einer Klasse hat die gleichen Attribute.<br />
Jedes Objekt einer Klasse unterscheidet sich aber in<br />
mindestens einem Attributwert von allen anderen <strong>Objekte</strong>n.<br />
werden mit Hilfe von Variablen implementiert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 29
… in der Projektbeschreibung<br />
<br />
<br />
Attribute entsprechen meist der Beschreibungen eines Objekts.<br />
Das Auto ist rot <strong>und</strong> hat einen KM-Stand von 130.000.<br />
Die Milch ist pasteurisiert.<br />
Sobald ein Buch im Lager vorhanden ist, wird es an den<br />
K<strong>und</strong>en ausgeliefert.<br />
Attribute sind Substantive, die einen Rückbezug auf ein<br />
anderes Substantiv besitzen.<br />
Die Menge des Artikels.<br />
Ausleihdatum des Buches.<br />
Anmeldung eines Autos.<br />
Objektorientierte Programmierung, 09.09.10 Seite 30
… als <strong>Klassen</strong>variable implementieren<br />
«<br />
»<br />
class Rechteck(object):<br />
anzahl = 0<br />
farbeKante = "Black"<br />
farbeFuellung = "White"<br />
Objektorientierte Programmierung, 09.09.10 Seite 31
<strong>Klassen</strong>variablen ...<br />
<br />
<br />
<br />
<br />
<br />
werden innerhalb der Klasse, aber außerhalb einer Methode<br />
definiert.<br />
werden häufig zu Beginn des <strong>Klassen</strong>rumpfes aufgelistet.<br />
sind Attribute, die alle <strong>Objekte</strong> besitzen.<br />
können von jeden Objekt der Klasse verändert werden.<br />
sind globale Attribute eines Objekts.<br />
Objektorientierte Programmierung, 09.09.10 Seite 32
Mit <strong>Klassen</strong>variablen arbeiten<br />
« Rechteck_Class.Rechteck.farbeFuellung = "Blue" »<br />
« Modul.Klasse.Attribut = Wert »<br />
<br />
<br />
<br />
<br />
Eine <strong>Klassen</strong>variable kann nicht über die Instanz aufgerufen<br />
werden.<br />
Eine <strong>Klassen</strong>variable kann nur mit Hilfe des <strong>Klassen</strong>namens<br />
verändert werden.<br />
Der <strong>Klassen</strong>name <strong>und</strong> das Attribut werden durch einen Punkt<br />
miteinander verb<strong>und</strong>en.<br />
Das Modul gibt Auskunft darüber, wo die Klasse definiert ist.<br />
Objektorientierte Programmierung, 09.09.10 Seite 33
Methoden (Memberfunction, Elementfunktion) ...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
beschreiben das Verhalten eines Objekts.<br />
lesen oder verändern Attributwerte.<br />
beschreiben eine Schnittstelle nach außen.<br />
werden innerhalb der Klasse definiert.<br />
werden nur einmal für die Klasse im Speicher angelegt.<br />
ergeben sich aus den Attributen <strong>und</strong> deren Nutzung in einer<br />
Klasse.<br />
sind in Python immer öffentlich, können aber auch privat sein.<br />
entsprechen Funktionen aus der prozeduralen<br />
Programmierung.<br />
Objektorientierte Programmierung, 09.09.10 Seite 34
… in der Projektbeschreibung<br />
<br />
<br />
Methoden sind meist Verben.<br />
Das Bankkonto wird eröffnet.<br />
Der Inhaber hebt eine bestimmte Summe von seinem Konto<br />
ab.<br />
Beschreibung einer Zustandsänderung / Änderung:<br />
Wenn die Ampel gelb ist, wird die Geschwindigkeit des<br />
Autos vermindert.<br />
Wenn die Helligkeit draußen einen bestimmten Prozentwert<br />
unterschreitet, wird die Straßenlaterne eingeschaltet.<br />
Eine Zugdurchfahrt wird gemeldet. Die Schranke wird<br />
geschlossen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 35
… in Python<br />
«<br />
class Rechteck(object):<br />
def setPos(self, xPos, yPos):<br />
self.xPos = xPos<br />
self.yPos = yPos<br />
»<br />
def getFarbeFuellung(self):<br />
return self.farbeFuellung)<br />
Objektorientierte Programmierung, 09.09.10 Seite 36
Methodenkopf<br />
Eine Methode beginnt mit dem Schlüsselwort « def ».<br />
<br />
<br />
<br />
Dem Schlüsselwort folgt der Methodenname.<br />
Der Methodenname ist frei wählbar.<br />
Der Name kommt aber nur einmal in einer Klasse vor.<br />
Für den Methodennamen gelten die gleichen Regeln wie für<br />
Funktions- <strong>und</strong> <strong>Klassen</strong>namen.<br />
Dem Methodennamen folgt die Parameterliste. Als erster<br />
Parameter wird immer « self» oder eine andere Instanz<br />
angegeben.<br />
Der Methodenkopf endet mit dem Doppelpunkt.<br />
Objektorientierte Programmierung, 09.09.10 Seite 37
Methodenrumpf ...<br />
<br />
<br />
<br />
<br />
ändern mit Hilfe von Anweisungen Attributwerte von <strong>Objekte</strong>n<br />
oder <strong>Klassen</strong>variablen.<br />
implementiert ein bestimmtes Verhalten einer Klasse.<br />
beschreibt eine Aktion der Klasse<br />
kann mit Hilfe von « return » einen Wert an den Aufrufer<br />
zurückgeben.<br />
Objektorientierte Programmierung, 09.09.10 Seite 38
Methoden aufrufen<br />
«<br />
»<br />
RechteckBlau.setPos(0, 10)<br />
RechteckBlau.getPos()<br />
print("Füllungsfarbe: ", RechteckBlau.getFarbeFuellung())<br />
<br />
<br />
Die Methode wird mit der Instanz immer durch ein Punkt<br />
verb<strong>und</strong>en.<br />
Falls die Methode nicht definiert ist, wird die Fehlermeldung<br />
„AttributeError“ ausgegeben.<br />
Objektorientierte Programmierung, 09.09.10 Seite 39
Spezielle Methoden ...<br />
<br />
<br />
<br />
<br />
<br />
sind in Python für « object » vordefiniert.<br />
beginnen <strong>und</strong> enden mit zwei Unterstrichen.<br />
haben einen definierten Namen.<br />
gibt es auch für Listen, Dictionaries etc.<br />
<strong>definieren</strong> Vergleiche oder mathematische Operationen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 40
… im Leben einer Instanz<br />
Instanz initialisieren<br />
Rechteck = classRechteck.Rechteck()<br />
Methode __new__<br />
erzeugt ein Objekt<br />
Methode __init__<br />
initialisiert ein Objekt<br />
Mit dem Objekt arbeiten<br />
Rechteck.farbeFuellung = "Blue"<br />
Verweis auf das Objekt<br />
zerstören<br />
del Rechteck<br />
Methode __del__<br />
löscht ein Objekt<br />
Objektorientierte Programmierung, 09.09.10 Seite 41
Destruktor<br />
Mit Hilfe von « del RechteckBlau » wird automatisch der<br />
dazugehörige Destruktor « def __del__() » aufgerufen.<br />
Als Parameter wird der Methode das zu zerstörende Objekt<br />
übergeben.<br />
Die Methode wird implementiert, wenn zum Beispiel ...<br />
Netzwerkverbindungen getrennt werden müssen.<br />
Dateien geschlossen werden müssen.<br />
bestimmte Fehler abgefangen werden.<br />
Objektorientierte Programmierung, 09.09.10 Seite 42
… in Python<br />
«<br />
class Rechteck(object):<br />
»<br />
def __del__(self):<br />
pass<br />
Objektorientierte Programmierung, 09.09.10 Seite 43
„self“ als Parameter ...<br />
ist ein Platzhalter für den Aufrufer der Methode.<br />
beantwortet die Frage „Wer hat die Methode aufgerufen?“.<br />
ist meist das erste Argument einer Methode.<br />
beschreibt die Instanz, die die Methode aufgerufen hat.<br />
Objektorientierte Programmierung, 09.09.10 Seite 44
Konstruktor<br />
<br />
<br />
<br />
<br />
initialisiert mit Hilfe der Methode « __init__ » die Attributwerte<br />
eines Objekts.<br />
definiert einen Anfangszustand für ein Objekt.<br />
wird automatisch bei der Erzeugung einer Instanz aufgerufen.<br />
muss nicht implementiert werden.<br />
Objektorientierte Programmierung, 09.09.10 Seite 45
Merkmale eines Konstruktors<br />
<br />
<br />
<br />
Ein Konstruktor ist exakt einmal in einer Klasse implementiert.<br />
Die Initialisierungsroutine ist einmalig für eine Klasse.<br />
Dem Konstruktor können Parameter für die Initialisierung<br />
übergeben werden.<br />
Ein Konstruktor gibt nie einen Wert an den Aufrufer zurück.<br />
Objektorientierte Programmierung, 09.09.10 Seite 46
… Python<br />
«<br />
class Rechteck(object):<br />
»<br />
def __init__(self, paraBreite, paraHoehe):<br />
self.xPos = 0<br />
self.yPos = 0<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
Objektorientierte Programmierung, 09.09.10 Seite 47
Aufbau der Parameterliste<br />
<br />
<br />
<br />
« self » ist der erste Parameter in der Liste. Welches Objekt wird<br />
initialisiert?<br />
Alle Parameter, die gesetzt werden müssen, folgen<br />
anschließend. Für diese Parameter muss ein Wert an die<br />
Initialisierungsroutine übergeben werden.<br />
Zum Schluss folgen optionale Parameter. Diese Parameter<br />
können bei der Initialisierung einer Instanz als Parameter<br />
übergeben werden, müssen aber nicht. Jeder dieser Parameter<br />
hat eine Vorgabe, die genutzt wird, wenn kein Parameter<br />
übergeben wird.<br />
Objektorientierte Programmierung, 09.09.10 Seite 48
Optionale Parameter nutzen<br />
«<br />
class Rechteck(object):<br />
»<br />
def __init__(self, paraBreite = 10, paraHoehe = 10):<br />
self.xPos = 0<br />
self.yPos = 0<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
Objektorientierte Programmierung, 09.09.10 Seite 49
Objektvariablen ...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
beschreiben ein Objekt<br />
werden im Konstruktor einer Klasse initialisiert.<br />
werden in Abhängigkeit der Instanz gesetzt.<br />
haben für jedes Objekt einen anderen Wert.<br />
können mit Hilfe von Methoden verändert werden.<br />
können in einem Konstruktor definiert werden, müssen aber<br />
nicht.<br />
können in einer Methode definiert werden. Diese Variablen<br />
werden automatisch für das Objekt angelegt. Eine Hinweis für<br />
den Nutzer wird nicht herausgegeben. Das Programm wird<br />
dadurch schwer lesbar.<br />
Objektorientierte Programmierung, 09.09.10 Seite 50
… im Konstruktor implementieren<br />
«<br />
class Rechteck(object):<br />
»<br />
def __init__(self, paraBreite = 10, paraHoehe = 10):<br />
self.xPos = 0<br />
self.yPos = 0<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
Objektorientierte Programmierung, 09.09.10 Seite 51
<strong>Klassen</strong>-Variablen im Konstruktor<br />
«<br />
class Rechteck(object):<br />
ANZAHL = 0<br />
FARBE_KANTE = "Black"<br />
FARBE_FUELLUNG = "White"<br />
»<br />
def __init__(self, paraBreite = 10, paraHoehe = 10):<br />
self.__xPos = 0<br />
self.__yPos = 0<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
self.ANZAHL = self.ANZAHL + 1<br />
Objektorientierte Programmierung, 09.09.10 Seite 52
Die Anweisung ...<br />
<br />
<br />
<br />
« self.ANZAHL = self.ANZAHL + 1 » legt für ein Objekt die Variable<br />
« ANZAHL » an.<br />
Zu dem <strong>und</strong>efinierten Wert der Objektvariablen wird der Wert<br />
„eins“ addiert.<br />
Es findet kein Zugriff auf die <strong>Klassen</strong>variable statt.<br />
<strong>Klassen</strong>variable <strong>und</strong> Objektvariable besitzen aber den gleichen<br />
Namen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 53
<strong>Klassen</strong>-Variablen im Konstruktor<br />
«<br />
class Rechteck(object):<br />
ANZAHL = 0<br />
FARBE_KANTE = "Black"<br />
FARBE_FUELLUNG = "White"<br />
»<br />
def __init__(self, paraBreite = 10, paraHoehe = 10):<br />
self.__xPos = 0<br />
self.__yPos = 0<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
self.__class__.ANZAHL = self.__class__.ANZAHL + 1<br />
Objektorientierte Programmierung, 09.09.10 Seite 54
Die Anweisung ...<br />
<br />
<br />
<br />
« self.__class__.ANZAHL = self.__class__.ANZAHL + 1 » greift auf die<br />
<strong>Klassen</strong>variable « ANZAHL » zu.<br />
Zu dem Wert der <strong>Klassen</strong>variable wird der Wert eins addiert.<br />
Das spezielle Attribut « __class__ » definiert, die zu einer Instanz<br />
gehörenden Klasse.<br />
Objektorientierte Programmierung, 09.09.10 Seite 55
Der Begriff „Sichtbarkeit“ ...<br />
<br />
<br />
beschreibt den Zugriff auf <strong>Klassen</strong>- oder Objektattributen.<br />
von Variablen in Python wird nur mit Hilfe von Konventionen<br />
geregelt. Diese Konventionen sollten eingehalten werden,<br />
müssen aber nicht.<br />
Objektorientierte Programmierung, 09.09.10 Seite 56
Öffentlich, sichtbare Attribute ...<br />
<br />
<br />
<br />
<br />
<br />
<br />
Beispiele:<br />
« Rechteck_class.Rechteck.FARBE_FUELLUNG = "Blue" »<br />
« RechteckBlau.xPos = 200 »<br />
werden wie Variablen benannt.<br />
können von außen gelesen <strong>und</strong> verändert werden.<br />
als <strong>Klassen</strong>variable: klasse.variable.<br />
als Objektvariable: objekt.variable.<br />
<strong>Klassen</strong>variablen sind standardmäßig öffentlich.<br />
Objektorientierte Programmierung, 09.09.10 Seite 57
Private Attribute ...<br />
<br />
<br />
<br />
<br />
<br />
Beispiele:<br />
« __FARBE_KANTE = "Black" »<br />
« self.__xPos = 0 »<br />
beginnen mit zwei Unterstrichen.<br />
können laut Konvention nur innerhalb der Klasse gelesen <strong>und</strong><br />
geschrieben werden. Ein Zugriff von außen auf diese Attribute<br />
ist nicht möglich.<br />
werden mit Hilfe von get-Methoden gelesen.<br />
werden mit Hilfe von set-Methoden verändert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 58
Schwache private Attribute ...<br />
<br />
<br />
<br />
<br />
<br />
<br />
Beispiele:<br />
« _FARBE_KANTE = "Black" »<br />
« self._xPos = 0 »<br />
beginnen mit einem Unterstrich.<br />
können laut Konvention nur innerhalb der Klasse gelesen <strong>und</strong><br />
geschrieben werden. Ein Zugriff von außen auf diese Attribute<br />
ist nicht möglich.<br />
werden mit Hilfe von get-Methoden gelesen.<br />
werden mit Hilfe von set-Methoden verändert.<br />
werden nicht durch die Anweisung « from … import * » in eine<br />
Datei importiert.<br />
Objektorientierte Programmierung, 09.09.10 Seite 59
Get- <strong>und</strong> Set-Methoden für eine Klasse<br />
«<br />
class Rechteck(object):<br />
def __init__(self, paraBreite = 10, paraHoehe = 10):<br />
self.__xPos = 0<br />
self.__yPos = 0<br />
self.hoehe = paraHoehe<br />
self.breite = paraBreite<br />
def getPosY(self):<br />
return self.__yPos<br />
»<br />
def setPosY(self, pos):<br />
self.__yPos = pos<br />
Objektorientierte Programmierung, 09.09.10 Seite 60
Properties ...<br />
<br />
<br />
<br />
binden get- <strong>und</strong> set-Methoden an einen Attributnamen.<br />
kapseln Attribute eines Objekts.<br />
werden mit Hilfe der Funktion « property » erstellt.<br />
Objektorientierte Programmierung, 09.09.10 Seite 61
… in Python<br />
«<br />
class Rechteck(object):<br />
def getPosY(self):<br />
return self.__yPos<br />
def setPosY(self, pos):<br />
self.__yPos = pos<br />
»<br />
yPos = property(getPosY, setPosY)<br />
Objektorientierte Programmierung, 09.09.10 Seite 62
Funktion property<br />
« property(get, set, del, docString) »<br />
<br />
<br />
<br />
<br />
Alle Funktionen, die als Parameter übergeben werden, müssen<br />
definiert sein.<br />
Falls get-Methoden als Parameter übergeben werden, kann<br />
das gekapselte Attribut gelesen werden.<br />
Falls set-Methoden als Parameter übergeben werden, kann<br />
das gekapselte Attribut verändert werden.<br />
wird am Ende des <strong>Klassen</strong>rumpfes aufgerufen.<br />
Objektorientierte Programmierung, 09.09.10 Seite 63
… aufrufen<br />
« print( RechteckBlau.yPos ) ».<br />
<br />
<br />
Der Name der Property wird mit dem Instanznamen durch den<br />
Punkt verb<strong>und</strong>en.<br />
Der Aufruf einer Property <strong>und</strong> eines Attributs ist gleich..<br />
Objektorientierte Programmierung, 09.09.10 Seite 64
Lesender oder schreibender Zugriff<br />
<br />
<br />
Lesender Zugriff:<br />
« print( RechteckBlau.yPos ) ».<br />
Es wird automatisch die entsprechende get-Methode<br />
aufgerufen.<br />
Schreibender Zugriff:<br />
« RechteckBlau.yPos = 100 ».<br />
Es wird automatisch die entsprechende set-Methode<br />
aufgerufen.<br />
Falls keine set-Methode implementiert ist, wird der Fehler<br />
AttributeError ausgegeben.<br />
Objektorientierte Programmierung, 09.09.10 Seite 65