14
1 Kapitel 14: Einführung in die Objekt-Orientierte Programmierung Einführung in die Informatik Wintersemester 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 Einleitung Verwendung vordefinierter Objekte in Python Definition eigener Klassen in Python Attribute und Methoden Klassenattribute Vererbung Polymorphismus Hauptlernziele Verständnis allgemeiner Prinzipen der OOP Fähigkeit, einfache objektorientierte Programme in Python schreiben können Literatur Michael Weigend. Objektorientierte Programmierung mit Python. 2. Aufl. Bonn (MITP) 2005. Bernd Oestereich. Objektorientierte Softwareentwicklung. Oldenbourg. 1999

Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

  • Upload
    vutuyen

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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

Page 2: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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

Page 3: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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)

Page 4: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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

Page 5: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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()

Page 6: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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)

Page 7: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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

Page 8: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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

Page 9: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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

Page 10: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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)

Page 11: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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 …

Page 12: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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'

Page 13: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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!")

Page 14: Kapitel 14: Einführung in die Objekt-Orientierte ... · PDF file4 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg OOP in Python: Arbeiten mit vordefinierten

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