modul: programmierung b-prg grundlagen der programmierung … · 2006-11-17 · 4 7 programmieren 1...
TRANSCRIPT
1
Hier wird Wissen Wirklichkeit
Modul: Programmierung B-PRGGrundlagen der Programmierung 1 – Teil 1 – V10
Klassen
Prof. Dr. Detlef KrömkerProfessur für Graphische DatenverarbeitungInstitut für InformatikFachbereich Informatik und Mathematik (12)
Prof. Dr. Detlef Krömker2 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Rückblick
Wir haben wichtige Datenstrukturen kennen gelernt
Felder (array) Listen (list)Mengen (set) Stapel (stack)(Warte-)Schlange (queue) Verbund (struct)Dictionaries Weitere
und deren Realisierungen in Python!
2
Prof. Dr. Detlef Krömker3 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Rückblick
Zahlen
Zeichen
Kollektionen
Wahrheitswerte
aufrufbar
None
Sequenzen
Abbildungen
Mengen
elementare
Prozeduren
Klassen
Ganzzahlen
Gleitkommazahl.
div. Kodierungendiv. Kodierungen
integer
Komplexe Zahlen
long
float
decimal
ustring
complex
string
class
def
list [ ]
dictionary { }
tupel ( )
Python Objekte
set ( )frozenset ( )
�
�
�
�
�
�
�
�
unmutable
mutable
Aufzählungstypen
�
�
�
�
�
Prof. Dr. Detlef Krömker4 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Wo sind wir in Teil1?
V 0 Begrüßung und Einführung----V 1 Daten – Information – WissenV 2 Computer – Algorithmus – ProgrammV 3 Variablen – Datentypen – Objekte ----V 4 Elementare numerische DatentypenV 5 Zeichenketten----V 6 Verzweigungen und SchleifenV 7 Prozeduren----V 8 Aggregierte DatentypenV 9 KlassenV10 Graphen und BäumeV11 Bibliotheken
3
Prof. Dr. Detlef Krömker5 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Noch ein Rückblick: Objekte
Der Begriff Objekt im Kontext der Objektorientierten Programmierung (Abkürzung OOP) .
Aus der Blickrichtung der Datentypen ist OOP eine Variante, bei der zusammengehörige Daten (Attribute) und die darauf arbeitende Programmlogik (Methoden) zu Einheiten zusammengefasst werden, den so genannten Objekten.
Prof. Dr. Detlef Krömker6 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Prozedurales ObjektorientiertesProgrammieren Programmieren
4
Prof. Dr. Detlef Krömker7 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Unser heutiges Lernziel
In der Objektorientierten Programmierung ist das Konzept der Klasse
grundlegend für die Realisierung verschiedener Paradigmen:
‣ Abstraktion,
‣ Kapselung,
‣ Polymorphie,
‣ Vererbung,
‣ Introspektion.
Diese sind zu verstehen und deren Realisierung in Python kennen zu
lernen.
Prof. Dr. Detlef Krömker8 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Und bitte beachten Sie!
Programmieren erfordert Disziplin, Ausdauer,
abstraktes Denkvermögen, Kreativität und hohe
Lernbereitschaft!
Warum sage ich Ihnen das immer wieder?
‣ Leistungsnachweis: etwa 40 - 50 % Programmieraufgaben
‣ etwa 20% Multiple Choice – haben auch Python-Fragen!
‣ Sie können schon 10% vorab haben! Rechnen Sie selbst ... es geht
theoretisch ohne Programmieren, aber es wird schwer!
‣ Erfahrungen mit dem PRG-Praktikum (3. Semester) ...
Klage dort: Wir haben zu wenig Programmiererfahrung!
5
Prof. Dr. Detlef Krömker9 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Übersicht
Objekte – Klassen – Instanzen
‣ Klassen und Instanzen‣ Kapselung‣ Vererbung und Polymorphie‣ Introspektion‣ Klassenbibliotheken
Klassen in Python
‣ Die class - Anweisung‣ Klasseninstanzen‣ Referenzzählung und Zerstörung von Instanzen‣ Vererbung‣ Datenkapselung‣ Überladen von Operatoren‣ Introspektion‣ Zusammenfassung der Namenskonventionen
Prof. Dr. Detlef Krömker10 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Paradigmen der OO-Programmierung
‣ Abstraktion
‣ Kapselung
‣ Polymorphie
‣ Vererbung
‣ Introspektion
‣ Klassen
‣ Methoden
6
Prof. Dr. Detlef Krömker11 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Klassen und Instanzen (1)
Klassen sind Vorlagen, aus denen Objekte (Instanzen) zur Laufzeit erzeugt werden.
‣ Im Programm werden dann nicht einzelne Objekte, sondern eine Klasse gleichartiger Objekte definiert.
‣ Klassen sind die „Konstruktionspläne“ (Schablonen) für Objekte.
‣ Die Klasse entspricht in etwa einem Datentyp, geht aber darüber hinaus: Sie legt nicht nur die Datenstrukturen fest, aus denen die mit Hilfe der Klassen erzeugten Objekte bestehen, sie definiert zudem die Algorithmen (Methoden).
Prof. Dr. Detlef Krömker12 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Klassen und Instanzen (2)
‣ Im Kontext der Datenstrukturen (Datentypen) realisieren Klassen also einen konstruktiven Weg neue benutzerspezifische Datenstrukturenund die darauf arbeitenden Methoden zu beschreiben (zu programmieren).
‣ In rein objektorientierten Sprachen wie Smalltalk und auch in Python werden dem Prinzip alles ist ein Objekt folgend, auch elementare Typen wie Ganzzahlen (Integer) durch Objekte repräsentiert.
‣ Auch Klassen selbst sind hier Objekte, die wiederum Ausprägungenvon Metaklassen sind.
‣ Viele Sprachen, unter anderem C++ und Java folgen allerdings nicht der „reinen Lehre“.
7
Prof. Dr. Detlef Krömker13 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Klassen
‣ Die Struktur einer Klasse bilden die Attribute (auch Eigenschaften).
‣ Attribute selbst können auch wieder komplexe Datentypen (z.B. Listen, Mengen, Dictionaries) oder Klassen sein.
‣ Aus Klassen erzeugte Objekte werden Instanzen (Exemplare) der Klasse genannt.
‣ In manchen Programmiersprachen gibt es zu jeder Klasse ein bestimmtes Objekt (Klassenobjekt), das dazu dient, die Klasse zur Laufzeit zu repräsentieren; dieses Klassenobjekt ist dann z.B. zuständig für die Erzeugung (Instanzierung) von Objekten der Klasse durch einen Konstruktor.
Prof. Dr. Detlef Krömker14 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Kapselung (encapsulation):
bezeichnet den kontrollierten Zugriff auf Objekte.
Anmerkung: Das Kapselungsprinzip gibt es auch unabhängig von objektorientierten Konzepten, z.B. als Modularisierungsprinzip.
Vom Innenleben eines Objektes soll der Benutzer (Programmierer des aufrufenden Objekts) möglichst wenig wissen müssen (Geheimnisprinzip, information hiding).
Durch die Kapselung werden nur Informationen über das "Was" eines Objektes (was es leistet) nach außen sichtbar, nicht aber das "Wie" (die interne Repräsentation).
Es wird eine Schnittstelle nach außen definiert und zugleich dokumentiert.
8
Prof. Dr. Detlef Krömker15 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Kapselung in UML
Attribute und Methoden können sein:
public (+): Zugreifbar für alle Ausprägungen (auch die anderer Klassen)
private (-): Nur für Ausprägungen der eigenen Klasse zugreifbar
protected (#): Nur für Ausprägungen der eigenen Klasse und von Spezialisierungen der selben zugreifbar
package (~): erlaubt den Zugriff für alle Elemente innerhalb des eigenen Pakets
Prof. Dr. Detlef Krömker16 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Vorteile der Kapselung (1)
‣ Dadurch, dass die Implementierung eines Objektes anderen Objekten nicht bekannt ist, kann die Implementierung geändert werden, ohne die Zusammenarbeit mit anderen Objekten zu beeinträchtigen.
‣ Beim Zugriff über eine Zugriffsfunktion spielt es von außen keine Rolle, ob diese Funktion 1:1 im Inneren des Objekts existiert, das Ergebnis einer Berechnung ist, oder möglicherweise aus anderen Quellen (z.B. einer Datei oder Datenbank) stammt.
‣ Erhöhte die Übersichtlichkeit, da nur die öffentliche Schnittstelle eines Objektes betrachtet werden muss.
‣ Deutlich verbesserte Testbarkeit, Stabilität und Änderbarkeit der Software
9
Prof. Dr. Detlef Krömker17 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Beispiel:
‣ Ein Bankkonto könnte beispielsweise folgendermaßen definiert werden:
‣ hat eine Kontonummer (Attribut name) ‣ hat einen Kontoinhaber (Referenz auf einen Kunden) ‣ hat eine Liste von Buchungen (Liste von Referenzen auf Buchungen) ‣ kann eine Einzahlung durchführen (Methode deposit) ‣ kann eine Auszahlung durchführen (Methode withdraw)‣ kann den Saldostand mitteilen (Methode inquiry)
Dieses und die zugehörige Syntax kennt der anwendende Programmierer ... nicht aber wie es implementiert ist!
Prof. Dr. Detlef Krömker18 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Durchatmen!Paradigmen der OO-Programmierung
‣ Abstraktion
‣ Kapselung
‣ Polymorphie
‣ Vererbung
‣ Introspektion
‣ Klassen
‣ Methoden
�
�
�
�
10
Prof. Dr. Detlef Krömker19 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Vererbung und Polymorphie
Klassen können von anderen Klassen abgeleitet werden (Vererbung).
‣ Dabei erbt die Klasse die Datenstruktur (Attribute) und die Methoden von der vererbenden Klasse (Basisklasse).
‣ In der abgeleiteten Klasse (Subklasse) können Methoden der Basisklasse in den meisten Programmiersprachen überschrieben werden, d.h. einzelne Methode neu implementiert, und eigene Methoden und Daten (Attribute) hinzufügt werden.
‣ Ein Objekt der abgeleiteten Klasse kann überall verwendet werden, wo ein Objekt der Basisklasse erwartet wird; überschriebene Methoden werden dann auf der abgeleiteten Klasse ausgeführt (Polymorphie).
‣ Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren.
Prof. Dr. Detlef Krömker20 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Vererbung und Polymorphie (2)
Die Nutzung der Vererbung bietet sich an, wenn es Objekte gibt, die konzeptionell aufeinander aufbauen. Gegebenenfalls lassen sich Objektdefinitionen von vorneherein so aufteilen, dass identischeMerkmale in der Definition eines "vererbenden" Objektes zusammengefasst werden.
Unter bestimmten Voraussetzungen können Algorithmen, die auf denSchnittstellen eines bestimmten Objekttypes operieren, auch mit davon abgeleiteten Objekten zusammenarbeiten.
11
Prof. Dr. Detlef Krömker21 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Superklasse – Subklasse ... Terminologie
‣ Vererbungsbeziehungen zwischen Objekten werden in der Regel mit Hilfe von Klassendefinitionen hergestellt.
‣ Dabei bezeichnet man die "vererbende" Klasse als Basisklasse oder auch Superklasse und die "erbende" Klasse als abgeleitete Klassebzw. Subklasse
Superklasse = Basisklasse = OberklasseSubklasse = abgeleitete Klasse = UnterklasseMethode = Elementfunktion = MemberfunktionAttribut = Datenelement = MemberExemplar = Instanz
Prof. Dr. Detlef Krömker22 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
„Das“ klassische Beispiel
Ein Fahrzeug besitzt bestimmte Attribute, diese können z.B. Höchstgeschwindigkeit, maximale Zuladung und Farbe sein.
Die Klasse Kraftfahrzeug erbt all diese Attribute, kann aber noch zusätzliche Attribute besitzen. Des Weiteren kann ein Kraftfahrzeug auch zusätzliche Methoden wie Motor starten besitzen
Die Klasse Personenkraftwagen kann dann wiederum von Kraftfahrzeug abgeleitet werden
Durch die Ableitung von Kraftfahrzeug erbt der Personenkraftwagen automatisch alle Attribute von Kraftfahrzeug und Fahrzeug.
- Höchstgeschwindigkeit- maximale_Zuladung- Farbe
Fahrzeug
- Fahren (Geschwindigkeit)
- Art_des_Antriebs- Leistung
Kraftfahrzeug
- Starte_Motor
- Anzahl der Sitzplätze
Personenkraftwagen
12
Prof. Dr. Detlef Krömker23 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Kriterien
Ob eine Klasse in einer Vererbungsbeziehung zu einer anderen Klasse steht, lässt sich durch eine einfache "ist-ein"-Regel feststellen, also
‣ Ein Personenkraftwagen ist ein Kraftfahrzeug, ‣ ein Personenkraftwagen ist ein Fahrzeug, aber
‣ ein Fahrzeug ist kein Personenkraftwagen – weil nicht jedes Fahrzeug ein Personenkraftwagen ist!
Ein Personenkraftwagen ist auch kein Sitz, sondern ‣ ein Personenkraftwagen besitzt einen oder hat einen Sitz.
‣ Die Beziehung „hat einen“ kennzeichnet die Attribute einer Klasse.
Prof. Dr. Detlef Krömker24 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Mehrfachvererbung
Von Mehrfachvererbung spricht man, wenn eine Klasse mehrere unmittelbare Basisklassen hat.
Beispiel: Modellierung eines Amphibienfahrzeugs
hat Attribute von Landfahrzeug
als auch die von Wasserfahrzeug erbt.
Amphibienfahrzeug
- Tiefgang
Wasserfahrzeug
- Anzahl_der_Räder
Landfahrzeug
13
Prof. Dr. Detlef Krömker25 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Implementierung der Mehrfachvererbung
Nur wenige Programmiersprachen bieten die Möglichkeit der Mehrfachvererbung.
Programmiersprachen mit Mehrfachvererbung sind z.B. C++, Eiffel und Python.
Dagegen unterstützen z.B. Smalltalk und Ada Mehrfachvererbung nicht.
Als Einwand gegen Mehrfachvererbung wird häufig genannt, dass es das Design unnötig verkompliziere und undurchsichtig machen könne?
Prof. Dr. Detlef Krömker26 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Eingeschränkte Implementierungen der Mehrfachvererbung
‣ Java, Delphi und C# bieten mit so genannten „Schnittstellen“ eine eingeschränkte Form der Mehrfachvererbung.
‣ Hierbei kann eine Klasse maximal von einer Basisklasse abgeleitet werden, jedoch kann sie beliebig viele Schnittstellen erben.
‣ Damit verpflichtet sich diese Klasse, die Methoden der Schnittstellen zu erfüllen.
‣ Mit einfacher Vererbung und eingeschränkter Mehrfachvererbung inForm von Schnittstellen sind die meisten Anforderungen an ein Software-Design realisierbar, ohne die „Nachteile“ der uneingeschränkten Mehrfachvererbung in Kauf nehmen zu müssen.
14
Prof. Dr. Detlef Krömker27 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Introspektion
‣ Introspektion (engl introspection, auch Reflexion (engl. reflection) bedeutet, dass ein Programm Erkenntnisse über seine eigene Struktur gewinnen kann.
‣ Eine wichtige Rolle spielt Introspektion im Zusammenhang mit typsicherer Programmierung, aber auch in Fragen der Persistenz (persistente Datenhaltung von Objekten und deren Beziehungen).
‣ Introspektion ermöglicht es, z.B. zur Laufzeit Informationen über Klassen oder deren Instanzen abfragen zu können. Bei einer Methode sind das u.a. deren Sichtbarkeit, der Typ des Rückgabewertes oder der Typ der Übergabeparameter. Die Umsetzung ist dabei sprachspezifisch realisiert.
Prof. Dr. Detlef Krömker28 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Klassenbibliotheken
Klassen werden in der Regel in Form von Klassenbibliothekenzusammengefasst, die häufig thematisch organisiert sind.
vergleichbar mit Modulen oder Paketen.
15
Prof. Dr. Detlef Krömker29 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Entwicklung von OO-Programmiersprachen (ohne Python)
Prof. Dr. Detlef Krömker30 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Klassen in Python
Klassen sind der wesentliche Mechanismus, um
‣ Datenstrukturen und neue Datentypen
zu definieren.
Klassen in Python ‣ Die class - Anweisung‣ Klasseninstanzen‣ Referenzzählung und Zerstörung von Instanzen‣ Vererbung‣ Datenkapselung‣ Überladen von Operatoren‣ Introspektion‣ Zusammenfassung der Namenskonventionen
16
Prof. Dr. Detlef Krömker31 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Die class - Anweisung
‣ definiert eine Menge von Attributen (Variablen) genannt Klassenvariablen und
‣ Funktionen (Methoden)
Klassen werden mit der class-Anweisung definiert.
Der Rumpf einer Klasse enthält eine Folge von Anweisun-gen, die ausgeführt werden, wenn die Klasse zum ersten Mal definiert wird.
Prof. Dr. Detlef Krömker32 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Beispiel
class Account:"Eine einfache Klasse"account_type = "Basic"def __init__(self, name, balance):
"Initialisiere eine neue Account-Instanz."self.name = nameself.balance = balance
def deposit(self, amount):"Addiere zur Bilanz hinzu."self.balance = self.balance + amount
def withdraw(self, amount):"Subtrahiere von der Bilanz."self.balance = self.balance - amount
def inquiry(self):"Gib aktuelle Bilanz zurueck."return self.balance
Dokumentations-String: String-Konstante direkt nach class Name: Dieser String im Attribut _ _doc_ _ des Objekts gespeichert. Auch bei Funftionen und ModulenVon help () (eingebaute Funktion) ausgewertet
Objekte, die während der Ausführung eines Klassenrumpfes erzeugt werden, werden in ein Klassenobjekt platziert, das als Namensraum dient. Auf die Attribute der Klasse Account kann man wie folgt zugreifen:•Account.account_type•Account.__init__•Account.deposit•Account.withdraw•Account.inquiry
Klassenvariablen wie account_type sind solche, die allen Instanzen einer Klasse identisch zur Verfügung stehen, d.h. sie gehören nicht einzelnen Instanzen (für Java- und C++-Programmierer: Klassenvariablen verhalten sich wie statische Variablen).
Funktionen, die innerhalb einer Klasse definiert werden (d.h. Methoden)
operieren immer auf einer Klasseninstanz, die als erstes Argument übergeben wird.
Gemäß einer Konvention wird dieses Argument self genannt, obwohl jeder
erlaubte Bezeichner verwendet werden könnte.
17
Prof. Dr. Detlef Krömker33 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
help (Account)>>> help (Account)Help on class Account in module __main__:
class Account| Eine einfache Klasse| | Methods defined here:| | __init__(self, name, balance)| Initialisiere eine neue Account-Instanz.| | deposit(self, amt)| Addiere zur Bilanz hinzu.| | inquiry(self)| Gib aktuelle Bilanz zurueck.| | withdraw(self, amt)| Subtrahiere von der Bilanz.| | -------------------------------------------------------------------| Data and other attributes defined here:| | account_type = 'Basic'
>>>
Prof. Dr. Detlef Krömker34 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Achtung:
Es ist wichtig festzuhalten, dass eine class-Anweisung keine Instanzen einer Klasse erzeugt (d.h. im obigen Beispiel werden keine Konten erzeugt).
Stattdessen definiert eine Klasse nur die Menge von Attributen und Methoden, über die alle Instanzen verfügen, sobald sie erzeugt werden.
Funktionen, die innerhalb einer Klasse definiert werden (d.h. Methoden) operieren immer auf einer Klasseninstanz, die als erstes Argument übergeben wird.
18
Prof. Dr. Detlef Krömker35 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Zusammengefasst:
‣ Die class-Anweisung erzeugt ein Klassen-Objekt und weißt diesem einen Namen zu.
‣ Zuweisungen in class-Anweisungen erzeugen Klassen-Attribute, die Zustand und Verhalten von Objekten exportieren.
‣ Klassenmethoden sind (ggf. verschachtelte) def mit einem speziellen ersten Argument self, das die Instanzvariable aufnimmt.
‣ Zuweisungen an Attribute des ersten Arguments (zum Beispiel self.X = obj) in Methoden erzeugen instanzspezifische Attribute.
Prof. Dr. Detlef Krömker36 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Instanzen einer Klasse
werden erzeugt, indem ein Klassenobjekt wie eine Funktion aufgerufen wird
Dies erzeugt eine neue Instanz und ruft die Methode __init__() der Klasse auf, falls definiert.
Beispiel: zum Erzeugen von Konten
‣ a = Account("Rainer", 1000.00) ‣ b = Account("Maria", 100000000000)
Diese Anweisungen rufen folgendes auf: Account.__init__(a, "Rainer", 1000.00)
19
Prof. Dr. Detlef Krömker37 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Beispiel
>>> a.deposit(100.00) # Ruft Account.deposit(a, 100.00) auf>>> b.withdraw (20.00)>>> print a.nameRainer>>> print a.account_typeBasic>>> a.inquiry ()1100.0>>> b.inquiry ()99999999980.0>>>
Prof. Dr. Detlef Krömker38 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Referenzzählung und Zerstörung von Instanzen
‣ Alle Instanzen verfügen über einen Referenzzähler.
‣ Sobald dieser auf Null fällt, wird die Instanz zerstört
‣ Bevor die Instanz jedoch zerstört wird, sieht der Interpreter nach, ob für das Objekt eine Methode namens __del__() definiert ist, und ruft diese gegebenenfalls auf.
‣ Gelegentlich wird ein Programm die del-Anweisung verwenden, um eine Referenz auf ein Objekt zu löschen.
20
Prof. Dr. Detlef Krömker39 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Zusammengefasst:
‣ Eine Klasse wie eine Funktion aufzurufen class_name ()erzeugt ein neues Instanzobjekt dieser Klasse.
‣ Jedes Instanzobjekt enthält alle Klassenattribute und bekommt seinen eigenen Namensraum für Attribute.
‣ Instanzen „erben“ Attribute jener Klasse von der sie erzeugt werden, sowie all derer Oberklassen (siehe Vererbung)
Prof. Dr. Detlef Krömker40 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Vererbung
‣ ist ein Mechanismus, um eine neue Klasse zu erzeugen, indem das Verhalten einer existierenden Klasse spezialisiert oder angepasst wird.
‣ Die ursprüngliche Klasse wird Basis- der Oberklasse genannt. ‣ Die neue Klasse wird abgeleitete oder Unterklasse genannt.
‣ Wenn eine Klasse mittels Vererbung erzeugt wird, »erbt« sie die Attribute, die in ihren Basisklassen definiert sind. Allerdings darf eine abgeleitete Klasse beliebige Attribute neu definieren oder neue Attribute selbst hinzufügen.
‣ Vererbung wird in der class-Anweisung mit einer durch Kommata getrennten Liste von Namen von Oberklassen angegeben.
21
Prof. Dr. Detlef Krömker41 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Beispiel
class A:varA = 42def method1(self):
print "Klasse A : method1"class B:
varB = 37def method1(self):
print "Klasse B : method1"def method2(self):
print "Klasse B : method2"
class C(A, B): # Erbt von A und B.varC = 3.3def method3(self):
print "Klasse C : method3"
class D: passclass E(C, D): pass
Die Suche nach einem in einer Oberklasse definierten Attribut erfolgt mittels Tiefensuche und von links nach rechts, d.h. in der Reihenfolge, in der die Oberklassen in der Klassendefinition angegeben wurden.
Die Oberklassen werden in der Reihenfolge C, A, B, D abgesucht. Für den Fall, dass mehrere Klassen das gleiche Symbol definieren, gilt, dass das zuerst gefundene Symbol genommen wird.
Prof. Dr. Detlef Krömker42 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Beispiel (2)
>>> c = C() # Erzeuge ein 'C'>>> c.method3() # Ruft C.method3(c) aufKlasse C : method3>>> c.method1() # Ruft A.method1(c) aufKlasse A : method1>>> c.varB # Greift auf B.varB zu37>>>
22
Prof. Dr. Detlef Krömker43 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Zusammengefasst
‣ Klassen erben Attribute von allen in der Kopfzeile ihrer Klassendefinition angegebenen Klassen (Oberklassen). Die Angabe mehrerer Klassen bewirkt Mehrfachvererbung.
‣ Der Vererbungsmechanismus durchsucht zunächst die Instanz, dann deren Klasse, dann alle erreichbaren Oberklassen (von links nachrechts) und benutzt die erste gefundene Version eines Attributnamens.
Prof. Dr. Detlef Krömker44 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Datenkapselung
‣ Allgemein gilt in Python, dass alle Attribute „öffentlich“ sind, d.h. alle Attribute einer Klasseninstanz sind ohne Einschränkungen überallsichtbar und zugänglich. Das bedeutet auch, dass alles, was in einer Oberklasse definiert wurde, an Unterklassen vererbt wird und dort zugänglich ist.
‣ Dieses Verhalten ist in objektorientierten Anwendungen oft unerwünscht, weil es die interne Implementierung eines Objektes freilegt (Widerspruch zur Kapselung) und zu Konflikten zwischen den Namensräumen von Objekten einer abgeleiteten und denen ihrer Oberklassen führen kann.
23
Prof. Dr. Detlef Krömker45 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Private Daten in Klassen
Um dies zu verhindern, werden alle Namen in einer Klasse, die mit einem doppelten Unterstrich beginnen, wie z.B. __Foo, „verstümmelt“, dass der Name die Form _Classname__Foo annimmt: name mangling
Namen in Modulen, die mit einem einzelnen Unterstrich beginnen, z.B. _Spam und jene die nicht in der __all__ -Liste des Moduls vorkommen, werden bei einem Import der Form from module import * nicht bekannt gemacht.
Dies erlaubt es einer Klasse, private Attribute zu besitzen, da solche privaten Namen in einer abgeleiteten Klasse nicht mit den gleichen privaten Namen einer Oberklasse kollidieren können.
Dies ist jedoch keine echte Kapselung (privacy), da solche Namen voll qualifiziert immer noch genutzt werden können.
Prof. Dr. Detlef Krömker46 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Überladen von Operatoren
‣ Klassen fangen eingebaute Operatoren ab und implementieren sie, indem sie Methoden mit speziellen Namen definieren, die mit zweiUnterstrichen beginnen und enden. Diese Namen werden von Oberklassen normal ererbt.
‣ Pro Operation wird genau eine Methode ausgeführt, sofern sie in der Suchhierarchie (siehe Namenskonventionen) gefunden wird, sonst tritt eine NameError auf.
‣ Python ruft also „automatisch“ die überladene Methode einer Klasse auf
‣ Wenn eine Klasse zum Beispiel die Methode namens __add__(self,other) definiert und a eine Instanz dieser Klasse ist, so ist a + other äquivalent zu a.add(other).
24
Prof. Dr. Detlef Krömker47 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Introspektion
Python stellt viele eingebaute Funktionen bereit, siehe Skript und Dokumentation.
Prof. Dr. Detlef Krömker48 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Zusammenfassung der Namenskonventionen (1)
(1) Namen, die mit zwei Unterstrichen beginnen und enden (zum Beispiel _ _init_ _), haben eine besondere Bedeutung für den Interpreter: Klassen fangen eingebaute Operationen ab und implementieren dieses auf ihre Art (Überladen die Methode), indem sie Methoden mit zwei Unterstrichen beginnen und enden lassen, die sie von ihrer Oberklasse geerbt haben.
(2) Namen, die mit einem Unterstrich beginnen, (z.B. _A) und denen auf oberster Ebene eines Moduls zugewiesen wird, werden bei frommodule import * nicht sichtbar. (Pseudo private Attribute)
(3) Namen in einer class-Anweisung, die mit zwei Unterstrichen beginnen, aber nicht damit enden, z.B. _ _A, wird der Name der Klasse vorangestellt (Pseudo private Attribute)
25
Prof. Dr. Detlef Krömker49 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Zusammenfassung der Namenskonventionen (2)
(4) Klassennamen beginnen normalerweise mit einem großen Buchstaben, z.B. MeineKlasse (Camel Casing)
(5) Der erste (am weitesten links stehende) Parameter der Methodendefinition innerhalb von Klassen wird normalerweise selfgenannt.
(6) Qualifizierte Namen werden als Attribute bezeichnet und unterliegen den Regeln für Objekt-Namensräumen. Zuweisungen in bestimmten lexikalischen Geltungsbereichen (beziehen sich auf die Schachtelung im Quellcode eines Programmes) initialisieren Objekt-Namensräume (Module, Klassen).
Prof. Dr. Detlef Krömker50 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Zusammenfassung der Namenskonventionen (3)
Unqualifizierte Namen unterliegen auch lexikalischen Gültigkeitsregeln. Zuweisungen binden solche Namen an den lokalen Gültigkeitsbereich, es sei denn, sie sind als global deklariert.
wie lokal modul __main__ Skript, interaktiver Modus
umgebendes Modul class-AnweisungKlasse
umgebendes Modul Funktionsaufruf Funktion, Methode
wie kokal, das Modul selbst
das Modul selbst Modul
Globaler BereichLokaler BereichKontext
26
Prof. Dr. Detlef Krömker51 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Fragen und (hoffentlich) Antworten
Prof. Dr. Detlef Krömker52 Hier wird Wissen WirklichkeitProgrammieren 1 – Teil 1 – V9WS 2005/2006
Ausblick
Graphen und Bäume ... „Brot und Butter“ Datenstrukturenund deren Implementierung
und zum Abschluss (nächsten Freitag):
noch einige Specials (kurz):
‣ Bibliotheken‣ Ein- und Ausgabe‣ exceptions‣ event-based programming
und der Abschluss des Teils 1
Danke für Ihre Aufmerksamkeit!