Objektorientierte Programmierung



Ähnliche Dokumente
Objektorientierte Programmierung OOP

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Java: Vererbung. Teil 3: super()

Arbeiten mit UMLed und Delphi

Reporting Services und SharePoint 2010 Teil 1

Primzahlen und RSA-Verschlüsselung

Grundlagen von Python

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

Einführung in die Java- Programmierung

Statuten in leichter Sprache

Repetitionsaufgaben Wurzelgleichungen

Professionelle Seminare im Bereich MS-Office

Schritte 4. Lesetexte 13. Kosten für ein Girokonto vergleichen. 1. Was passt? Ordnen Sie zu.

Das Leitbild vom Verein WIR

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0. EDV Kurs 13/2

Professionelle Seminare im Bereich MS-Office

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Was meinen die Leute eigentlich mit: Grexit?

Grundbegriffe der Informatik

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Informationsblatt Induktionsbeweis

Java Kurs für Anfänger Einheit 5 Methoden

1 topologisches Sortieren

Lichtbrechung an Linsen

Software Engineering Klassendiagramme Assoziationen

Erstellen von x-y-diagrammen in OpenOffice.calc

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Qualität und Verlässlichkeit Das verstehen die Deutschen unter Geschäftsmoral!

Nina. bei der Hörgeräte-Akustikerin. Musterexemplar

Papa - was ist American Dream?

1 Mathematische Grundlagen

Was ist Sozial-Raum-Orientierung?

Tutorium zur Mikroökonomie II WS 02/03 Universität Mannheim Tri Vi Dang. Aufgabenblatt 3 (KW 44) ( )

Windows XP Jugendschutz einrichten. Monika Pross Molberger PC-Kurse

Mediator 9 - Lernprogramm

Partitionieren in Vista und Windows 7/8

Kinderarmut. 1. Kapitel: Kinderarmut in der Welt

Outlook-Daten komplett sichern

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

infach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock

Speicher in der Cloud

Anleitung über den Umgang mit Schildern

Informatik für Schüler, Foliensatz 23 Konstruktor, String-Methode und Heldenklassse

Modellbildungssysteme: Pädagogische und didaktische Ziele

Erfahrungen mit Hartz IV- Empfängern

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Der Gabelstapler: Wie? Was? Wer? Wo?

der Eingabe! Haben Sie das Ergebnis? Auf diesen schwarzen Punkt kommen wir noch zu sprechen.

Strom in unserem Alltag

Kulturelle Evolution 12

1. LINEARE FUNKTIONEN IN DER WIRTSCHAFT (KOSTEN, ERLÖS, GEWINN)

Xcode/Cocoa/Objective-C Crashkurs Programmieren unter Mac OS X

Weltenbummler oder Couch-Potato? Lektion 10 in Themen neu 3, nach Übung 5

Satzhilfen Publisher Seite Einrichten

Einrichten eines HBCI- Zugangs mit Bank X 5.1

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

VibonoCoaching Brief -No. 18

Datensicherung. Beschreibung der Datensicherung

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Aufgabe: Knapp bei Kasse

Geld Verdienen im Internet leicht gemacht

BIA-Wissensreihe Teil 4. Mind Mapping Methode. Bildungsakademie Sigmaringen

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Sollsaldo und Habensaldo

Objektorientierte Programmierung

Ebenenmasken Grundlagen

Was bedeutet Inklusion für Geschwisterkinder? Ein Meinungsbild. Irene von Drigalski Geschäftsführerin Novartis Stiftung FamilienBande.

Was man mit dem Computer alles machen kann

Informationen zum Ambulant Betreuten Wohnen in leichter Sprache

10.1 Auflösung, Drucken und Scannen

CSS-Grundlagen. Etwas über Browser. Kapitel. Die Vorbereitung

How to do? Projekte - Zeiterfassung

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Zahlen auf einen Blick

Erstellen einer digitalen Signatur für Adobe-Formulare

Papierverbrauch im Jahr 2000

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Ein und dieselbe Taufe

SWE5 Übungen zu Software-Engineering

1: 9. Hamburger Gründerpreis - Kategorie Existenzgründer :00 Uhr

Guide DynDNS und Portforwarding

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

s zu Hause lesen

Internet Explorer Version 6

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Leichte-Sprache-Bilder

Vibono Coaching Brief -No. 39

Wir arbeiten mit Zufallszahlen

Client-Server-Beziehungen

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Bilder zum Upload verkleinern

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Jederzeit Ordnung halten

Deutsches Rotes Kreuz. Kopfschmerztagebuch von:

Transkript:

Objektorientierte Programmierung Ein Computerprogramm besteht aus Funktionen (Programmabschnitten, die etwas tun) und Variablen (Speicherplätzen für Informationen). Werden Funktionen aktiviert, verändern sie diese Variablen. Manchmal gehören Variable und Werte 'zusammen' und bilden eine logische Einheit. Ein Buntstift etwa hat eine bestimmte Farbe, eine bestimmte Länge und kann zum Schreiben und Zeichnen verwendet werden. Das Objekt Buntstift hat Eigenschaften (Farbe, Länge) Variable Fähigkeiten (schreiben und zeichnen) Funktionen Versuchen wir, eine Lampe zu beschreiben: Das Objekt Lampe hat eine Eigenschaft: nämlich den Zustand, ob sie brennt oder nicht Fähigkeiten: man kann sie einschalten und ausschalten wie könnte man das umsetzen: Objekt Lampe: def einschalten(): brennt = 1 def ausschalten(): brennt = 0 Hier gibt's aber ein Problem. Wie wir wissen, sind Variable prinzipiell lokal und nur innerhalb der Funktion gültig. Somit ist das brennt in einschalten() ein anderer Speicherplatz als das brennt in ausschalten(). Wir müssen den Funktionen sagen, dass es eine spezielle Variable brennt überall im Objekte Lampe gibt, also ihr 'eigenes' brennt. Um das zu ermöglichen, wird einer Funktion in einem Objekt immer automatisch der Name des Objektes selbst (englisch: self) übergeben. Und diesen dürfen wir verwenden. Jetzt klappt es so: Objekt Lampe: def einschalten(self): def ausschalten(self): So ein Aufwand für eine einzelne Lampe sieht etwas übertrieben aus. Tatsächlich können Objekte in guten Programmiersprachen mehr. Man programmiert sich nicht das Objekt alleine, sondern allgemeiner ein Muster (eine Klasse) dieses Objektes. Aus so einer Vorlage kann dann das Objekt konkret erzeugt werden und nicht nur das, man kann dann beliebig viele Objekte erzeugen. Wir folgen dabei einer Python-Übereinkunft: Klassennamen schreiben wir mit großem Anfangsbuchstaben Wolfgang Urban, HIB Wien 1

Und wie bedient man nun eine solche Lampe? lichterl = Lampe() lichterl.ein() lichterl.aus() Wir erzeugen ein Lampen-Objekt einschalten ausschalten Die Schreibweise lichterl.ein() mit dem Punkt zwischen Objektname und Funktion ist typisch in der objektorientierten Programmierung und leichter lesbar als 'ein(lichterl)'. Noch ein Fachausdruck: unser lichterl ist ein Objekt, das nach dem Muster der Klasse Lampe erzeugt wird. Anders herum: lichterl ist ein konkretes Auftreten eines Exemplars vom Typ Lampe bzw. ein konkretes Beispiel für einen Vertreter der Klasse Lampe. Und da auf Englisch 'zum Beispiel' 'for instance' heißt, sagt man ganz gelehrt: Das Objekt lichterl ist eine Instanz der Klasse Lampe. Die Variable brennt bezeichnet man als Instanzvariable oder Attribut, da sie eine Eigenschaft dieses Objektes ist. Und statt 'Funktion eines Objektes' spricht man gern von einer Methode des Objekts. Jetzt wollen wir unsere Lampen aber verbessern. Es wäre doch schön, könnten wir feststellen, ob sie auf- oder abgedreht sind. Wir verpassen der Lampe eine Methode namens zustand. def zustand(self): if self.brennt == 1: print 'Ich leuchte!' print '' Wir testen: >>> funserl.ein() Ich leuchte! >>> funserl.aus() Sieht gut aus! Ist es aber noch nicht... Wolfgang Urban, HIB Wien 2

... AttributeError: Lampe instance has no attribute 'brennt' Beim Erzeugen des Objektes hat brennt noch keinen Wert. Sogar schlimmer brennt existiert überhaupt noch nicht! Und das erklärt die Fehlermeldung. Da es häufig so ist, dass Klassenvariable einen Anfangswert benötigen, gibt es dafür eine spezielle Methode in Python. Sie heißt init, wobei die doppelten Unterstreichungszeichen vorn und hinten auch eine Besonderheit dieser Funktion signalisieren sollen: sie wird nämlich vollautomatisch ausgeführt, wenn das Objekt erzeugt wird! Wenn wir die Lampe anfangs ausgeschaltet sein lassen wollen, klappt es so: def zustand(self): if self.brennt == 1: print 'Ich leuchte!' print '' Und nun ein Experiment mit mehreren Lampen, die alle aus der selben Klasse erzeugt werden. Beachte, dass jede ihre eigene private Eigenschaft brennt besitzt! >>> leuchte = Lampe() >>> funserl.ein() >>> x = Lampe() >>> x.ein() Ich leuchte! >>> leuchte.zustand() >>> x.aus() >>> x.zustand() Randbemerkung: In C++ und Java schreibt man üblicherweise this statt self. Wir könnten dies auch in Python so tun (oder ein ganz anderes Wort wählen), doch hat sich 'self' eingebürgert und alle schreiben das so. Wieso man das auch tun sollte? Um sich daran zu gewöhnen. Und wenn man einmal fremde Programme liest, weiß man sofort, dass 'self' die Referenz auf das Objekt selbst ist und muss nicht umdenken. Das Überschreiben von Rechenoperationen wie + oder / ist ebenfalls möglich und wird als überladen bezeichnet. (In Python mit speziellen Methodennamen wie add,...) Wolfgang Urban, HIB Wien 3

Vererbung Nun ein umfangreicheres Beispiel. Wir wollen ein Sparbuch modellieren. Welche Eigenschaften hat es: die Höhe des Guthabens Was kann man mit ihm tun: einzahlen, abheben (aber nur, wenn der Betrag auch vorhanden ist) und den Guthabensstand abfragen. class Sparbuch: self.guthaben = 0 def stand(self): print self.guthaben def einzahlen(self,betrag): self.guthaben += betrag def abheben(self,betrag): if betrag<=self.guthaben: guthaben -= betrag >>> s = Sparbuch() >>> s.einzahlen(50) >>> s.stand() 50 >>> s.einzahlen(90) >>> s.abheben(100) >>> s.stand() 40 >>> s.abheben(60) So viel Geld hast Du nicht! Übung: wir wollen mitzählen, wie viele Einzahlungen und Abhebungen stattgefunden haben. Die Ausgabe des Guthabenstandes soll z.b. 'Guthaben 315 Euro nach 7 Einzahlungen und 3 Abhebungen' lauten. ein Mangel unserer Klasse: man kann die Einzahlung durch Angabe eines negativen Geldbetrages austricksen. Blockiere derartige Fehleingaben bei Einzahlung und Abheben. Die print-ausgabe im Fehlerfall ist nicht sehr flexibel. Besser wäre es, den Fehler mittels raise als Ausnahme zu behandeln, die man mittels try except vom aufrufenden Programm aus erkennen kann. Ein Bankkonto Eine besondere Art von Sparbuch ist ein Bankkonto. Es hat zwei Besonderheiten: man kann mehr abheben, als man besitzt (der Überziehungsrahmen), und man kann Geld auf ein anderes Konto überweisen. Die Attribute und Methoden des Sparbuchs sind aber immer noch sinnvoll. Deshalb programmieren wir das Konto als 'Erweiterung' des Sparbuches. Wir benutzen den Mechanismus der Vererbung um von der Grundklasse Sparbuch eine neue Klasse Konto abzuleiten. Dann erbt unsere neue Klasse alle Methoden und Attribute der alten Klasse (solange wir diese nicht umdefinieren)! Wolfgang Urban, HIB Wien 4

Die Methode abheben müssen wir allerdings verändern, um eine Kontoüberziehung zuzulassen. Wir überschreiben die Methode abheben der Klasse Sparbuch, das heißt wir ersetzen sie durch eine andere. (Sparbuch-Objekte sind von dieser Änderung natürlich nicht betroffen.) class Konto(Sparbuch): Sparbuch. init (self) self.rahmen = 400 def abheben(self,betrag): if betrag<=self.guthaben+self.rahmen: self.guthaben -= betrag def ueberweisen(self,zielkonto,betrag): if betrag<=self.guthaben+self.rahmen: self.abheben(betrag) zielkonto.einzahlen(betrag) neue Klasse ableiten init der alten Klasse rufen (guthaben=0) Überziehungsrahmen festlegen >>> fritz = Konto() >>> franz = Konto() >>> fritz.einzahlen(500) >>> fritz.stand() 500 0 >>> fritz.ueberweisen(franz,300) >>> fritz.stand() 200 300 >>> franz.abheben(400) -100 >>> fritz.abheben(900) So viel Geld hast Du nicht! Wolfgang Urban, HIB Wien 5