Upload
vutuyen
View
214
Download
0
Embed Size (px)
Citation preview
1
Kapitel 14:
Einführung in die Objekt-Orientierte Programmierung
Einführung in die InformatikWintersemester 2007/08
Prof. Bernhard Jung
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Übersicht
Grundzüge der Objektorientierten Programmierung (OOP) am Beispiel von Python
EinleitungVerwendung vordefinierter Objekte in PythonDefinition eigener Klassen in Python
Attribute und MethodenKlassenattributeVererbungPolymorphismus
Hauptlernziele• Verständnis allgemeiner Prinzipen der OOP• Fähigkeit, einfache objektorientierte Programme in Python schreiben können
LiteraturMichael Weigend. Objektorientierte Programmierung mit Python. 2. Aufl. Bonn (MITP) 2005. Bernd Oestereich. Objektorientierte Softwareentwicklung. Oldenbourg. 1999
2
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Was sind Objekte?
Reale Objektez.B. Auto, Telefon, Mensch, Konto, Versicherungspolice, …
Software-ObjekteModellieren Ausschnitte der RealitätSachgerechte Abstraktion
bzgl.
Eigenschaften / AttributenMethoden / Verhalten / Operationen / Algorithmen
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Objektorientierte Sichtweise: Welt als System von Objekten, die untereinander Botschaften austauschen
3
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Objekte besitzen Attribute und beherrschen Methoden
Name: SaschaStadt: BerlinÖffnungszeiten: Mo bis Fr 10:00-18:30
Blumensträuße bindenLieferauftrag entgegen nehmenBoten schicken
Attribute(Daten)
Methoden(Algorithmen)
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konzepte der OOP:
Klassen und Objekte
Klasse= Bauplan / Schema für Objektebeschreibt prinzipiellen Aufbau (Eigenschaften/Attribute) und Verhalten bei Erhalt von Nachrichten (verfügbare Methoden) einer Menge von gleichartigen ObjektenKlassen verschmelzen logisch zusammengehörige Daten und Operationen zu einer Einheit
Instanz (Objekt)= Konkretisierung / Inkarnation einer Klasse
z.B. Mark und Sascha sind Instanzen von Blumenhändler
Alle Instanzen einer Klasse beherrschen dieselben Methodenhaben dieselben Attribute (wenn auch mit verschiedenen Werten)
4
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python:Arbeiten mit vordefinierten Klassen
Aufruf von Methoden eines Objekts mit Syntax: objekt.methode()Methoden für Listen-Objekte
list.reverse() – Reihenfolge der Listenelemente wird umgekehrtlist.sort() – Sortierung der Listenelemente in aufsteigender Reihenfolgelist.extend(list2) – Liste wird um Elemente von list2 erweitert…
>>> l = [1,3,5,2]>>> l.extend([7,6])>>> print l[1, 3, 5, 2, 7, 6]>>> l.reverse()>>> print l[6, 7, 2, 5, 3, 1]>>> l.sort()>>> print l[1, 2, 3, 5, 6, 7]
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
>>> help(list)Help on class list in module __builtin__:
class list(object)| list() -> new list| list(sequence) -> new list initialized from sequence's items| | Methods defined here:…| append(...)| L.append(object) -- append object to end| | count(...)| L.count(value) -> integer -- return number of occurrences of value| | extend(...)| L.extend(iterable) -- extend list by appending elements from the iterable| | index(...)| L.index(value, [start, [stop]]) -> integer -- return first index of value| | insert(...)| L.insert(index, object) -- insert object before index| | pop(...)| L.pop([index]) -> item -- remove and return item at index (default last)| | remove(...)| L.remove(value) -- remove first occurrence of value| | reverse(...)| L.reverse() -- reverse *IN PLACE*| | sort(...)| L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;| cmp(x, y) -> -1, 0, 1
5
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python:Arbeiten mit vordefinierten Klassen
Beispiel: Erzeugen grafischer Benutzeroberflächen mit dem Modul "Tkinter"
Klasse Tkrepräsentiert ein Fenster Attribute, u.a.
labelMethoden, u.a.
title(String) mainloop()
Erzeugen von Tk-Objekten per Konstruktor: Tk()
Klasse Labelrepräsentiert einfaches Text-ElementMethoden, u.a.
pack()Erzeugen von Label-Objekten per Konstruktor: Label( Tk, …)
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python:Arbeiten mit vordefinierten Klassen
from Tkinter import *fenster = Tk()fenster.title("Hello World")fenster.label = Label(fenster,
text="Hello Tkinter World")fenster.label.pack()fenster.mainloop()
6
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python: Definition eigener Klassen (1)
Definition von Klassen mit Schlüsselwort classin besonderer Methode __init__ werden Attribute der Klasse initialisiert
Konstruktor der Klasse, die bei Erzeugung von Instanzen aufgerufen wirdbesondere Variable self referenziert das neue Objekt Methode __init__ sollte immer als erstes Argument self haben
Instanzen werden durch Aufruf der Klasse erzeugtArgumente entsprechend Konstruktor, jedoch ohne erstes Argument
>>> c = Circle1()>>> print c<__main__.Circle1 instance at 0x00B45850>>>> print c.x0.0>>> c.x = 2.0>>> print c.x2.0>>> c.x, c.y = 1.5, 2.5>>> print c.x, c.y1.5 2.5>>>
class Circle1:
def __init__(self):self.x = 0.0self.y = 0.0self.r = 1.0
Beispiel: Objekte vom Typ "Kreis" beschrieben über Position (x,y) und Radius
Erzeugen einer Instanz
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python: Definition eigener Klassen (2)
Konstruktor mit mehreren ArgumentenBem: das Überladen von Methoden (z.B.: __init__ ) in derselben Klassendefinition - d.h. gleicher Methodenname, aber unterschiedliche Argumente – ist in Python i.Ggs. zu anderen OOP-Sprachen nicht möglich stattdessen: Methoden mit Default-Argumenten
Definitionen der Methoden getPos(), setPos()in Definition mit Argument selfbei Aufruf der Methode ohne Argument self
>>> c = Circle2(2.0, 1.0, 1)>>> c.getPos()(2.0, 1.0)>>> c.setPos(-1.0, 3)>>> c.getPos()(-1.0, 3)>>> c.r1
class Circle2:
def __init__(self,x=0.0,y=0.0,r=1.0):self.x = xself.y = yself.r = r
def setPos(self, x, y):self.x, self.y = x, y
def getPos(self):return (self.x, self.y)
7
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konzepte der OOP:
Geheimnisprinzip (Information Hiding)
Geheimnisprinzip (Information Hiding)Auf die Attribute eines Objekts kann nicht direkt zugegriffen werden, stattdessen erfolgt der Zugriff ausschließlich über Zugriffsoperatoren. Es werden also die Implementierungen der Operationen und die Datenstrukturen selbst versteckt.
Vorteil: Implementierungsdetails können beliebig geändert werden, ohne Auswirkung auf den Rest des Programms zu haben
Bem: das Geheimnisprinzip wird in Python (wie auch in anderen OOP-Sprachen) nicht erzwungen. Es werden aber Möglichkeiten bereit gestellt, Attribute nach außen zu verstecken
Sichtbarkeit von Attributen (und Methoden)
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python: Sichtbarkeit von Attributen
Zugriff auf Attribute kann eingeschränkt werden
Öffentliche Attribute:lesender und schreibender Zugriff auch außerhalb der Klassendefinitionz.B. Klasse Circle2
Private Attributein Python Unterscheidung zwischen stark und schwach privaten Attributenstark private Attribute
Zugriff von außen überhaupt nicht möglichsyntaktisch: Attributname beginnt mit zwei Unterstrichen, z.B. __x
schwach private AttributeZugriff von außerhalb des Moduls (Phython-Skripts) eingeschränktsyntaktisch: Attributname beginnt mit einem Unterstrich, z.B. _x
>>> c = Circle2(2.0, 10.0, 3.5)>>> print c.x, c.y, c.r2.0 10.0 3.5
8
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python: Sichtbarkeit von AttributenBeispiel
Klasse Circle3 mit (stark) privaten AttributenZugriff auf Objekt-Attribute nur über getter- und setter-Methoden
class Circle3:def __init__(self, x, y, r):
self.__x = xself.__y = yself.__r = r
def setX(self, x ):self.__x = x
def getX(self):return self.__x
def setRadius(self, r):self.__r = r
def getRadius(self):return self.__r
>>> c = Circle3(2.0, 10.0, 3.5)>>> print c.__x
Traceback (most recent call last):File "<pyshell#40>", line 1, in -
toplevel-print c.__x
AttributeError: Circle3 instancehas no attribute '__x'>>> print c.getX()2.0>>>
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python: Klassenattribute
Beispiel: Es soll ein Zähler __numCircles für die Anzahl der Instanzen einer Klasse Circle4 erstellt werden
keine Eigenschaft einzelner Instanzengehört logisch zur Klasse Circle4
Klassenattributclass Circle4:
__numCircles = 0 # Klassenattribut
def __init__(self, x, y, r):self.__x = xself.__y = yself.__r = rCircle4.__numCircles = Circle4.__numCircles + 1print "total number of circles = ", Circle4.__numCircles
>>> c1 = Circle4(1.0, 1.0, 1)total number of circles = 1>>> c2 = Circle4(0.0, 0.0, 2)total number of circles = 2>>> c3 = Circle4(3.0, 3.0, 3)total number of circles = 3>>>
Initialisierung außerhalb von __init__
Zugriff mit Klassenname.Attributname
9
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konzepte der OOP - Vererbung
Oberklassen und Unterklassen in der Biologie
Quelle: de.wikipedia.org
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konzepte der OOP - Vererbung
Vererbung der Attribute (und Methoden) der Oberklasse an Unterklassed.h. alle geometrischen Figuren haben Position x, yKreis hat neben Position zusätzlich RadiusRechteck hat neben Position zusätzlich Seitenlängen a, b…
Geometrische Figur
Attribute: x, y
Kreis
Attribute: radius
Rechteck
Attribute: a, b
Dreieck
Attribute: a, b, c
10
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python - Vererbung
Definition von Oberklassenclass Klassenname(Oberklasse1, Oberklasse2 , …):…
class GeomFig:
def __init__(self, x, y):self.x = xself.y = y
class Circle(GeomFig):
def __init__(self, x, y, r):GeomFig.__init__(self, x, y)self.r = r
>>> c = Circle(1, 2, 4)>>> print c.x, c.y, c.r1 2 4>>>
Aufruf des Konstruktors der Oberklasse
Circle hat Oberklasse GeomFig
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python – VererbungFeinheiten
I.a. Vererbung von Attributen und Methoden an Unterklassestark private Attribute werden nicht vererbt
Unterklassen können Methoden der Oberklasse überschreiben Unterklasse definiert namensgleiche Methode wie Oberklasse ("method overriding")oft sinnvollPolymorphismus…
Unterklassen können Attribute der Oberklasse überschreibenUnterklasse definiert namensgleiches Attribut wie Oberklasse ("shadowing")meistens nicht sinnvoll
In Python ist auch Mehrfachvererbung möglich (d.h. mehr als eine Oberklasse) Mehrfachvererbung ist z.T. problematisch (z.B. in Java daher nicht möglich)
11
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konzepte der OOP – MehrfachvererbungNixon-Raute (Nixon diamond)
Quäkerdef istPazifist():return True
Republikanerdef istPazifist():return False
Nixon
…
Spezialisierung-vonSpezialisierung-von
Problem: welche Methoden-Definition soll bei Objekten vom Typ Nixon gelten?
in Python würde Methode der in der Klassendefinition zuerst genannten Oberklasse angewendet
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Konzepte der OOP - Polymorphismus
Polymorphismus ("Vielgestaltigkeit") : in verschiedenen Klassen können Methoden gleichen Namens definiert werden
in Python ist dies nicht möglich, aber vielen anderen OOP-Sprachen
auch: gleichnamige Methoden in Ober- und Unterklasse(method overriding)
auch in Python wichtiges Programmiermittel
damit verhalten sich die Instanzen der verschiedenen Klassen sehr unterschiedlich bei Erhalt derselben Botschaft (d.h. Aufruf jeweils unterschiedlicher Funktionen)
BeispielDefinition einer Methode drucke() in Oberklasse und in Unterklasse …
12
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python – Polymorphismus / MethodOverriding
class GeomFig: # Oberklassedef __init__(self, x, y):
self._x = xself._y = y
def drucke(self): return "x=" + str(self._x) + " y=" + str(self._y)
class Circle(GeomFig): # Unterklassedef __init__(self, x, y, r):
GeomFig.__init__(self, x, y)self._r = r
def drucke(self):return "x="+str(self._x) +" y="+ str(self._y) + " r="+str(self._r)
>>> g = GeomFig(0,0)>>> g.drucke()'x=0 y=0'>>> c = Circle(1.0, 1.0, 2)>>> c.drucke()'x=1.0 y=1.0 r=2'
überschreibende Methode
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
OOP in Python – Polymorphismusdie Methode __str__
besondere Methode __str__liefert eine String-Repräsentation eines Objekts zurückwird von print und str() verwendet(vordefiniert in impliziter Oberklasse object aller Python-Objekte)
class Circle(GeomFig):def __init__(self, x=0.0, y=0.0, r=0.0):
GeomFig.__init__(self, x, y)self._r = r
def __str__(self):return "x="+str(self._x) + " y="+str(self._y) + " r="+str(self._r)
>>> o = object()>>> o.__str__()'<object object at 0x0099C438>'>>> print o # benutzt __str__<object object at 0x0099C438>
besondere Methode __str__
>>> c = Circle(5.0, 8.0, 1.0)>>> c.__str__()'x=5.0 y=8.0 r=1.0'>>> print c # benutzt __str__x=5.0 y=8.0 r=1.0>>> str(c)'x=5.0 y=8.0 r=1.0'
13
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Sonstiges
Python-Klassen können auch ohne Methoden und ohne Sichtbarkeitsmodifikatoren der Attribute (d.h. alle Attribute öffentlich) definiert werden
d.h. Definition von Klassen ohne OOP-Prinzipien wie GeheimnisprinzipEntsprechung in etwa zu 'Strukturen' in C oder 'Records' in Pascal
class Mitarbeiter:def __init__(self, persnr, name, alter):
self.personalnr = persnrself.name = nameself.alter = alter
>>> james = Mitarbeiter("007", "Bond", 35)>>> print james.personalnr007>>> print james.nameBond>>> print james.alter35
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Sonstiges
Python-Klassen können auch ganz ohne Methoden und Attribute definiert werden
"leere Klasse" Hinzufügen von Attributen für Instanzen ist möglich
dies gilt für auch für Instanzen beliebiger KlassenDadurch auch Fehleranfälligkeit, z.B. Schreibfehler in AttributnamenVerringerte Fehleranfälligkeit durch strikte Einhaltung des Geheimnisprinzips, d.h. kein direkter Zugriff von außen auf Attribute, sondern nur auf Klassen
class Employee:pass
>>> john = Employee() # Erzeuge einen leeren Mitarbeiter-Satz.
# Fuelle die Felder des Satzes.john.name = 'John Doe'john.dept = 'computer lab'john.salary = 1000
leere Anweisung ("tue nichts!")
14
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Zusammenfassung: Definition eigener Klassen in Python
Klassendefinition: Klassenkopf + Klassenrumpf
KlassenkopfSchlüsselwort class
Name der Klasseevtl. Oberklassen in runden KlammernDoppelpunkt
Klassenrumpf (eingerückt)Definition der KlassenattributeDefinition der __init__-Methode (Konstruktor)
darin Initialisierung der Objektattribute
Definition weiterer Methoden
Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg
Zusammenfassung: Konzepte der OOP
Objektorientierung = Klassen und Objekte+ Kommunikation mit Nachrichten+ Vererbung(Coad & Yourdon)
Objektorientierte ProgrammiersprachenJava, C++, C#, Object Pascal (Delphi), Smalltalk, …Python: strikt objektorientiert – alle Daten sind Objekte