17.06.2014 Aufrufe

Klassen erstellen und Objekte definieren - RRZN

Klassen erstellen und Objekte definieren - RRZN

Klassen erstellen und Objekte definieren - RRZN

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!