6. Pool-Übung zum Modul „Einführung in die Informatik“

Werbung
TU Bergakademie Freiberg
Institut für Informatik
Modul „Einführung in die Informatik“
Poolübung
6. Pool-Übung zum Modul „Einführung in die Informatik“
- Aufgaben Thema: Programmieren in Python, Teil 4
(Bildbearbeitung mit PIL, Files, Zeichenketten; Wiederholung: Funktionen, Module;
Hausaufgabe: Objektorientierte Programmierung)
0)
Vorbereitende Übungen zur 6. Poolübung im interaktiven Modus von Python
(VOR der Übung durchzuarbeiten):
Anhang A:
Anhang B:
Anhang C:
Übungen im interaktiven Modus zur Aufgabe 1 (Bildbearbeitung mit PIL)
Übungen im interaktiven Modus zur Aufgabe 2 (Files)
(Hausaufgabe) Übungen im interaktiven Modus zur Aufgabe 4
(Objektorientierte Programmierung:
Klassen und Objekte)
----------------------------------------------------------------------------------------------------------------------------
1)
Bildbearbeitung mit dem Modul PIL
( PIL ... Python Imaging Library ):
Korrektur eines Grünstichs in einem Farbbild
Vorbemerkungen:
- Zur Installation des Moduls PIL auf dem Privat-PC/-Laptop:
Das Installationsfile PIL-1.1.6.win32-py2.5.exe für Python 2.5 (!) finden Sie im Verzeichnis
Y:\lehre\Modul_Einf_in_die_Informatik_WS0910_Jung\Installationsfiles_Python_und_Module\Modul
PIL fuer Python 2.5 oder im WWW unter http://www.pythonware.com/products/pil/ (dort auch das
Installationsfile für Python 2.6). Beim Starten dieser Datei packt sich PIL automatisch in das PythonBibliotheksverzeichnis Python252\Lib\site-packages aus.
- Am Anfang des Lösungsprogramms muss die Klasse Image aus dem Modul PIL importiert werden. Das kann durch from PIL import Image oder auch durch import Image geschehen.
- In Aufg. 1 wird die Kenntnis des Vorlesungsskripts Informatik12-Bildverarbeitung.pdf vorausgesetzt.
- Kopieren Sie zunächst alle Bildfiles aus Y:\lehre\Modul_Einf_in_die_Informatik_WS0910_Jung\
Pooluebungen\Multimediafiles\Bilder in das Python-Quelltextverzeichnis Z:\Python.
- Unter den kopierten jpg-Bildern befindet sich auch ein Bild GoldenGate_Gruenstich.jpg.
Öffnen Sie zunächst dieses Bild (mit einem Grünstich) mit einem beliebigen Bildbearbeitungsprogramm - z.B. mit IrfanView (oder durch Doppelklicken im Windows-Explorer).
- Eine nähere Untersuchung des Bildes ergab:
Der Grünstich kann entfernt werden, wenn man:
- in allen Pixeln mit einem Rotwert von 0<=Rotwert<=80 den Rotwert um 100% erhöht
- und in allen Pixeln mit einem Blauwert von 0<=Blauwert<=90
den Blauwert um 66,67% erhöht.
--------
Aufgabe:
Schreiben Sie ein Python-Skript zur Korrektur des Grünstichs
GoldenGate_Gruenstich.jpg. Gehen Sie dabei wie folgt vor:
- Beginnen Sie den Quelltext mit einer gesonderten Funktion zur Beseitigung des o.g. Grünstichs.
1
1209
in
- Nach dieser Funktion sind ins Hauptprogramm in Form eines Testrahmens folgende Anweisungen
aufzunehmen:
-- Das grünstichige Bild öffnen und daraus ein internes Bildobjekt erzeugen
-- Die Funktion zur Grünstichkorrektur aufrufen (Bildobjekt übergeben)
-- Nach Rückkehr aus der Funktion das korrigierte Bild anzeigen
-- schließlich das korrigierte Bild z.B. unter dem Bezeichner GoldenGate_ohneStich.jpg
ins Python-Arbeitsverzeichnis Z:\Python speichern
Wichtige Bemerkung zur Methode show( ) aus PIL:
Die Methode show( ) ist relativ einfach gehalten: das Bild wird in ein temporäres BMP-File mit einem
vom System gewählten Namen konvertiert und mit der mit dem Typ BMP verbundenen Anwendung geöffnet. Zuvor wird noch eine (schwarze) MS-DOS-Konsole geöffnet. Damit die Programmabarbeitung
nach show( ) fortgesetzt wird, muss man (z.B. mit der Maus) die geöffnete schwarze MS-DOS-Konsole
schließen (dann bleibt das Bild stehen) oder das Bild selbst schließen (dann wird auch das MS-DOSFenster geschlossen).
-------Öffnen Sie danach GoldenGate_ohneStich.jpg mit einem beliebigen Bildbearbeitungsprogramm.
-----------------------------------------------------------------------------------------------------------------------------
2)
Dateiarbeit (Files):
Einlesen eines Datenfiles mit ganzen Zahlen von Festplatte,
Berechnung der Fakultäten dieser Zahlen sowie
Schreiben der Resultate auf den Bildschirm und in ein neues Festplattenfile
(vgl. Vorlesung und Großübung 5, Aufg. 2.2)
In der 4. Großübung wurde in Aufgabe 1.a) ein Programm entwickelt, in dem in einer Funktion
nfak(n);
n ... natürliche Zahl (d.h. ganz und >= 0);
die Fakultät n! einer aus einem Testrahmen (Hauptprogramm) übergebenen natürlichen Zahl n
(mittels for-Zählschleife) ermittelt wird. Dieses Programm wurde als nfak_for_Modul.py gespeichert.
Dieses File ist im Plattenverzeichnis der 6. Poolübung zu finden. In Aufgabe 2 sollen dieses Modul
importiert und die Funktion nfak(n) daraus verwendet werden.
Vorbemerkungen:
- Wie in der Vorlesung behandelt, betrachtet Python Files (=Dateien) als Sequenz von Zeichen, die mit
den built-in-Funktionen nur als Zeichenkette (String) gelesen oder geschrieben werden können.
Will man also Zahlen aus einem File einlesen und dann verarbeiten, so muss man nach dem Lesen den
Zahlenstring durch int( ) bzw. float( ) in den geforderten Zahlentyp konvertieren. Beim Schreiben von
Zahlen in Files sind sie vorher mit str( ) in eine Zeichenkette zu konvertieren.
- Im Festplattenverzeichnis der 6. Poolübung ist ein ASCII-Textfile gzahlen.txt gespeichert, das natürliche ganze Zahlen (1 Zahl pro Zeile) enthält. Kopieren Sie dieses File ins Python-Arbeitsverzeichnis
Z:\Python. Sehen Sie sich zunächst den Inhalt dieses Files mit einem beliebigen Editorprogramm an
(z.B. Notepad/Editor).
Aufgabe: Ein vollständiges Python-Programm ist zu entwickeln, in dem alle ganzen Zahlen aus dem
Festplattenfile Z:\Python\gzahlen.txt in eine Liste eingelesen werden. Danach ist von jedem Listenelement die Fakultät zu bestimmen, wozu die Funktion nfak(n) aus dem Modul nfak_for_Modul.py zu
verwenden ist (siehe oben).
Die Resultate sind in der Form (hier für das Beispiel n=3 angegeben):
3! = 6
auf den Bildschirm sowie in ein neues Festplattenfile Z:\Python\fakultaeten.txt auszugeben (pro Fakultät eine Zeile).
Sehen Sie sich danach zur Kontrolle den Inhalt des Files Z:\Python\fakultaeten.txt mit einem beliebigen
Editorprogramm an (z.B. Notepad/Editor).
2
1209
3)
Berechnung der Quersumme einer natürlichen Zahl
sowie der Summe von Quersummen natürlicher Zahlen
a)
Berechnung der Quersumme einer natürlichen Zahl
Schreiben Sie eine Python-Funktion für die Berechnung der Quersumme einer natürlichen Zahl
(natZahl = 0, 1, 2, 3, …). Die natürliche Zahl ist vom aufrufenden Skript zu übergeben. Die berechnete
Quersumme ist an das aufrufende Programm zurückzugeben. In der Funktion ist nicht mit globalen Variablen zu arbeiten.
In einem Testrahmen (Hauptprogramm) zum Testen der Funktion ist eine natürliche Zahl von Tastatur
einzulesen. Danach ist die Funktion zur Berechnung der Quersumme aufzurufen. Das Resultat (Quersumme) soll im aufrufenden Testrahmen ausgegeben werden.
Fordern Sie im Testrahmen den Nutzer nach jeder erfolgten Berechnung einer Quersumme zur Eingabe
einer nächsten natürlichen Zahl auf. Ein Abbruch der Berechnung soll dabei durch Eingabe einer (beliebigen) negativen Zahl (als „natürliche Zahl“) erreicht werden.
- Beispiel zur Erklärung der Quersumme:
quersumme(4233) = 4+2+3+3 = 12
- Hinweis zum Lösungsalgorithmus:
Schreiben Sie zwei Versionen zur Berechnung der Quersumme:
- Erste Version: Konvertierung der eingelesenen natürlichen Zahl in einen String, zeichenweiser Zugriff auf die „Zifferbuchstaben“ und Konvertierung der „Zifferbuchstaben“ in eine ganze
Zahl.
Hinweis zum „zeichenweisen Zugriff“:
Es ist bekannt, dass die Zählgröße i aus der folgenden for-Schleife der Reihe nach die Werte
1, 2, …, 10 (also die Elemente der Liste) annimmt:
>>>for i in [1,2,3,4,5,6,7,8,9,10]:
print i
Allgemein gilt dies aber nicht nur für Listen, sondern für Kollektionen, d.h. für Listen, Zeichenketten,
Tupel, Dictionaries und Mengen. Also nimmt z.B. im folgenden Beispiel die Variable zeichen der Reihe
nach als Wert die Zeichen der Zeichenkette "Informatik" an (dadurch „zeichenweiser Zugriff“
möglich):
>>>for zeichen in "Informatik":
print zeichen, " ",
Nennen Sie in der ersten Lösungsversion die Funktion quersum(n). Speichern Sie die erste Lösungsversion unter der Bezeichnung Z:\Python\auf3a_quersumme.py ab. Dieser Quelltext soll in
Aufgabe b) als Modul importiert werden.
Verwenden Sie eventuell als Startfile das unvollständige Skript auf3a_quersumme_Startfile.py
- Zweite Version: sukzessive Verwendung des Divisionsrests der ganzzahligen Division
durch 10 sowie danach „Abhacken“ der letzten Ziffer der Zahl durch ganzzahlige Division durch 10 .
(Der Testrahmen ist in beiden Versionen gleich.)
Verwenden Sie eventuell als Startfile das unvollständige Skript auf3a_quersumme_V2_Startfile.py
-----------------
b)
Erweiterung
(Hausaufgabe):
Summe von Quersummen mehrerer natürlicher Zahlen
Erweitern Sie die erste Version der Lösung von 3.a) wie folgt:
Jetzt soll nicht die Quersumme einer natürlichen Zahl berechnet werden, sondern die Summe der
Quersummen mehrerer eingegebener natürlicher Zahlen. Eine Wiederholung der Berechnung (während eines Programmlaufs) wie in 3.a) soll hier aus Einfachheitsgründen nicht vorgesehen werden.
Beispiel:
Eingegeben wurde: [34, 567, 700]
Summe der 3 Quersummen = 32
1209
3
Hinweise zur Lösung:
Verwenden
Sie
evtl.
als
Startfile
das
unvollständige
Python-Programm
auf3b_summeVonQuersummen_Startfile.py aus dem bekannten Poolübungsverzeichnis.
In diesem Startfile erfolgt die Berechnung der Summe der Quersummen in folgender Weise:
- Im Hauptprogramm (Testrahmen) werden die natürlichen Zahlen eingegeben (Abbruch: beliebige negative Zahl) und in einer Liste natürlicher Zahlen gespeichert.
- Dann wird eine Funktion zur Berechnung der Summe der Quersummen aufgerufen. In dieser
Funktion (!!!) soll innerhalb der Anweisung zur Summenberechnung jeweils eine Funktion zur Berechnung der Quersumme einer natürlichen Zahl aufgerufen werden und zwar genau die Funktion zur
Berechnung der Quersumme aus der ersten Lösungsversion von 3.a). Dazu sollen der Quelltext
Z:\Python\auf3a_quersumme.py aus 3.a) als Modul importiert und die Funktion quersum(n) daraus
genutzt werden. (Hier wird also eine Funktion von einer anderen Funktion aus aufgerufen.)
- Die Lösung wird schließlich wieder im Testrahmen ausgegeben.
Ergänzen Sie das Startfile an den gekennzeichneten Stellen, und testen Sie das Programm.
-----------------------------------------------------------------------------------------------------------------------------
4*)
(Hausaufgabe)
Erzeugung von Objekten (Instanzen) einer eigenen Klasse Sphere („Kugel“)
und Übungen damit (OOP- Objektorientierte Programmierung)
Die folgende Aufgabe ist bewusst ähnlich zum Musterbeispiel aus dem Vorlesungsskript informatik11OOP.pdf, um zugleich das Verständnis für die Vorlesung zu fördern. Nehmen Sie also bei der Lösung
dieses Skript zu Hilfe.
Zu entwickeln ist ein vollständiges Python-Programm, in dem zunächst eine Klasse Sphere für das geometrische Objekt Kugel (Sphere) zu definieren ist. Diese Klasse soll als stark private
(Objekt-)Attribute (also keine öffentlichen Attribute) die drei Mittelpunktkoordinaten x, y, z sowie den
Radius r besitzen. (Auf ein solches – vor öffentlichem Zugriff geschütztes – stark privates Attribut kann
man nur innerhalb der Methoden eines Objekts der Klasse zugreifen. Von außerhalb kann man auf
stark private Attribute nur noch über Getter- und Setter-Methoden zugreifen.)
Fügen Sie ein (logisch zur Klasse gehörendes) Klassenattribut __numSpheres (siehe Vorlesung:
Bekanntlich gibt es Objektattribute, die sich auf Eigenschaften einzelner Objekte beziehen, und Klassenattribute, die Merkmale aller Objekte einer Klasse darstellen). Das Klassenattribut __numSpheres
soll als Wert die Anzahl der Objekte (Instanzen) der Klasse Sphere annehmen. Nach jeder Erzeugung
einer neuen Instanz soll der aktuelle Wert von __numSpheres ausgegeben werden.
Neben der Konstruktormethode soll die Klasse vier weitere Methoden besitzen:
- eine Methode zum Setzen des Mittelpunkts x,y,z (sog. Setter-Methode),
- eine Methode, die den aktuellen Mittelpunkt zurückgibt (sog. Getter-Methode)
- sowie je eine Methode zum Setzen und zum Zurückgeben des Radius.
Von einem Hauptprogramm in Form eines Testrahmens aus sind Objekte dieser Klasse zu erzeugen
und die Attribute zu manipulieren. Dabei ist wie folgt vorzugehen:
-- Erzeugung einer Einheitskugel als Objekt (Instanz) der Klasse Sphere
-- Ausgabe des beim Erzeugen gesetzten Mittelpunkts und Radius’ über die GetterMethoden (direkter Zugriff nicht möglich – probieren Sie es aus)
-- Setzen eines neuen Mittelpunkts und eines neuen Radius’ durch Methodenaufruf
-- Ausgabe des veränderten Mittelpunkts und Radius’ über die Getter-Methoden
-- Erzeugen eines beliebigen zweiten Objekts der Klasse Sphere,
um die erneute Ausgabe des Klassenattributs __numSpheres zu testen
Verwenden Sie eventuell als Startfile das unvollständige Skript auf4_classSphereStartfile.py.
----------------------------------------------------------------------------------------------------------------------------1209
4
Da es die 6. Poolübung die letzte Poolübung zu Python ist, wurden auf Wunsch
einiger Studenten mehrere fakultative zusätzliche Hausaufgaben zur individuellen
Übung ausgearbeitet. Um das vorliegende Aufgabenmanuskript nicht zu lang werden zu lassen, sind diese Zusatz-Hausaufgaben im pdf-Dokument
Pooluebung6_EidI_Fakultative_Zusatz-Hausaufg_WS0910.pdf
im Festplattenverzeichnis der Poolübung 6 zu finden.
Achtung: Darunter befindet sich auch eine Klausuraufgabe von 2007 zu Python.
-----------------------------------------------------------------------------------------------------------------------------
Anhänge:
Anhang A:
Übungen im interaktiven Modus zur Aufgabe 1 (Bildbearbeitung mit PIL)
- Geben Sie im folgende Kommandos ein und interpretieren Sie deren Wirkung:
>>> import Image
# Klasse Image (aus PIL) importieren
>>> im = Image.open(r"Z:\Python\everest.jpg")
#jpg-Bild oeffnen (einlesen) und internes Bildobjekt im erzeugen
>>> print im.format, im.size, im.mode
# Attribute Bildformat, Bildgroesse als Tupel (Breite, Hoehe), Bildmodus ausgeben
>>> im.show()
# Bildausgabe auf Bildschirm
# --> siehe Bemerkung zu show() unter Aufgabe 1 !
>>> im.save(r"Z:\Python\everest.png") # Speichern mit Konvertierung (jpg png)
>>> width, height = im.size
# Bildgröße an Tupel (width, height) zuweisen
# oder: (width, height) = im.size
>>> for xpix in range (width):
# von 0 bis width-1
for ypix in range (height):
# von 0 bis height-1
r, g, b = im.getpixel((xpix, ypix)) # pixelweise RGB-Werte holen
rneu, gneu, bneu = r, g, int(0.8*b) # Blauanteil reduzieren
im.putpixel( (xpix,ypix), (rneu,gneu,bneu) )
# Setzen der manipulierten RGB-Intensitaeten
>>> im.show()
# Bildausgabe des manipulierten Bildes auf Bildschirm
>>> im.save(r"Z:\Python\everest_wenigerBlau.jpg")
-----------------------------------------------------------------------------------------------------------------------------
Anhang B:
Übungen im interaktiven Modus zur Aufgabe 2 (Files)
Die Dateiarbeit (Arbeit mit Files auf Festplatte usw.) wurde im Vorlesungsskript
Informatik09-Python-IO.pdf behandelt. Dieser Vorlesungsstoff wird in Aufgabe 2 vorausgesetzt.
Dateien (files) sind Datenobjekte, die unter einem Dateibezeichner auf einem Peripheriespeicher (Festplatte, CD-ROM, DVD, Mediacard, Diskette, ...) gespeichert sind und dort vom Betriebssystem verwaltet werden.
Python betrachtet Files (=Dateien) allgemein als Sequenz von Zeichen (1 Byte/Zeichen), die mit den
eingebauten ("built-in") Funktionen nur als Zeichenkette gelesen bzw. geschrieben werden können.
Ein File ist (im Prinzip) beliebig lang; sein Ende wird durch das Steuerzeichen eof (end of file) gekennzeichnet.
Mit Hilfe des Konstruktors open( ) der vordefinierten Klasse File kann man gemäß
fileObjekt=open(<filebezeichner>,<modus>) die Datei <filebezeichner> öffnen und ein neues
5
1209
Fileobjekt mit dem Namen fileObjekt erzeugen, das mit dieser Datei verknüpft ist. (Hinweis: Statt
open(<filebezeichner>,<modus>)
kann
man
auch
den
identischen
Konstruktor
file(<filebezeichner>,<modus>) verwenden.) Beim Erzeugen des (logischen) Fileobjekts wird im
Hauptspeicher eine Datenstruktur angelegt, über die die Verbindung zur physischen Datei läuft. In dieser Datenstruktur wird auch ein „Dateizeiger“ (Cursor) verwaltet. Der Dateizeiger zeigt stets auf das
aktuelle Zeichen der Datei, das als nächstes zu lesen bzw. zu schreiben ist (d.h. auf die sogenannte
"aktuelle Fileposition"). Die zeichenweise Zählung der Datenzeiger-Position beginnt bei 0. Als Beispiel
zeigt der Dateizeiger nach dem Öffnen einer Datei im Modus „r“, „rw“ oder „w“ auf den Anfang der
Datei (Position 0L). Die aktuelle Position des Dateizeigers kann man über die Methode (Funktion)
fileObjekt.tell(
)
abfragen.
Man
kann
den
Dateizeiger
über
die
Methode
fileObjekt.seek(<zeichennummer>) auf eine neue aktuelle Position einstellen.
Man kann sich ein File prinzipiell als ein Magnetband vorstellen, das mit einem Schreib-Lese-Kopf
beschrieben und gelesen werden kann. Der Dateizeiger gibt dann die jeweilige Position des SchreibLese-Kopfes an.
Die wichtigsten Methoden zum Lesen/Schreiben von Dateien wie read, readline, readlines bzw. write,
writelines wurden in der Vorlesung behandelt:
read( )
... gesamte Datei wird (von der aktuellen Dateizeigerposition an) als String eingelesen
(mit allen Newline-Zeichen '\n')
readline( )
... eine Zeile wird (von der aktuellen Dateizeigerposition an) als String eingelesen
(einschließlich des abschließenden Newline-Zeichens '\n')
readlines( ) ... gesamte Datei wird (von der aktuellen Dateizeigerposition an) als Liste von Strings
eingelesen (jede Zeile als ein String einschließlich des abschließenden '\n')
write(string) ... schreibt einen String in die Datei ab aktuelle Dateizeigerposition
(evtl. wird überschrieben)
writelines(sequence) ... eine Sequenz von Strings wird konkateniert und in die Datei geschrieben;
es werden (im Gegensatz zum Namen) keine (!) Zeilenwechsel eingefügt.
(diese Methode braucht man seltener).
Auf die in der Vorlesung behandelte Ausgabe in Files mit print durch File-Umlenkung (mittels „>>“)
und auf das Lesen/Schreiben von Dateien mit den Funktionen load / dump aus dem Modul pickle wird
in der Übung aus Zeitgründen nicht eingegangen.
----------------------------------------------------------------------------------------------------------------------------# Es folgen Übungen im interaktiven Modus der IDLE:
>>> f=open(r'Z:\Python\test.out','w')
#Öffnen eines neues File zum Schreiben ('w'); Filebez. wegen \ als raw-String
>>> type(f)
#Durch open(…) wurde ein Objekt f vom Typ file erzeugt
>>> f.tell() #Ausgabe der aktuellen Position des "Dateizeigers" (hier: 0L)
>>> f.write('Freiburk/Sachsen') #Schreiben in File (mit Fehlern)
>>> f.tell()
#Ausgabe der aktuellen Position des "Dateizeigers" (hier:16L)
>>> f.seek(5)
#Einstellen der Position des Dateizeigers auf Zeichen "u"
>>> f.write('erg')#Überschreiben ab "u"
>>> f.close()
#Schließen des File
>>> f=open(r'Z:\Python\test.out','r')
#Öffnen eines existierenden Files zum Lesen ('r')
>>> text=f.read()
>>> text
#Ausgabe des korrigierten Textes: 'Freiberg/Sachsen'
>>> f.close()
# Öffnen Sie nun das geschriebene ASCII-File Z:\Python\test.out zur Kontrolle
# mit einem beliebigen Editorprogramm (z.B. Notepad/Editor).
6
1209
# Und nun weitere Uebungen zum Lesen/Schreiben von Dateien.
# Erklären Sie die Interpreter-Ausgaben anhand der obigen Beschreibung der Methoden:
>>> f=open(r'Z:\Python\datei.txt','w')
>>> f.write('Zeile 1\nZeile 2\nZeile 3\n')
>>> f.writelines(('rot','gelb','gruen'))
>>> f=open(r'Z:\Python\datei.txt','r')
>>> f.readline()
'Zeile 1\n'
#Ausgabe
>>> f.readlines()
['Zeile 2\n', 'Zeile 3\n', 'rotgelbgruen']
#Ausgabe
>>> f.seek(0)
>>> f.read()
'Zeile 1\nZeile 2\nZeile 3\nrotgelbgruen'
#Ausgabe
>>> f.read()
''
#Ausgabe
>>> f.close()
-----------------------------------------------------------------------------------------------------------------------------
Anhang C*:
(Hausaufgabe) Übungen im interaktiven Modus zur Aufgabe 4*
(Objektorientierte Programmierung:
Klassen und Objekte)
a)
Vorbemerkung zu Klassen und Objekten:
Eine Einführung in die Objektorientierte Programmierung war Gegenstand des Vorlesungsskripts
informatik11-OOP.pdf. Dieser Stoff wird für Aufgabe 4* vorausgesetzt.
Eine Klasse dient als Vorlage (Bauplan, Schablone) für Objekte dieser Klasse. Sie definiert Attribute (in
Form von Variablen) und Methoden (in Form von Funktionen). Ein Objekt ist eine konkrete Ausprägung - eine Instanz - einer Klasse. Erst beim Erzeugen von Objekten erhalten Attribute konkrete Werte
zugewiesen. Über die Methoden können diese Werte manipuliert werden. Die Attribute beschreiben den
Zustand und die Methoden das Verhalten von Objekten.
Aus einer anderen Sicht ist eine Klasse ein komplexer Datentyp mit zugehörigen Methoden, von dem
Variablen (Objekte) angelegt werden können. Jedes Objekt ist aus dieser Sicht eine Datenstruktur eines
komplexen Typs.
Namen von nutzerdefinierten Klassen sollten mit einem Großbuchstaben beginnen, Namen von Objekten mit einem Kleinbuchstaben.
(Hinweis: Auf Polymorphismus und Vererbung wird in der Übung aus Zeitgründen nicht eingegangen.)
-----b)
Vordefinierte Klassen:
Vordefinierte Klassen sind schon aus den ersten Vorlesungen bekannt, z.B. die vordefinierte Klasse list.
- Kurze Übung im interaktiven Modus der IDLE zu vordefinierten Klassen:
>>>li=[2,4,6]
#li ist ein Objekt (Instanz) der vordef. Klasse list
>>>li.append(8) #Aufruf der Methode append ; ein Methodenaufruf entspricht einer
#Botschaft (Nachricht) an ein Objekt, eine bestimmte Operation auszuführen
>>>print li
>>>li.insert(1,9) #vor dem Listenelement mit Index 1 als neues Element die Zahl 9 einfuegen
>>>li.extend([12,10]) #Aufruf einer weiteren Listen-Methode
>>>print li
>>>li.sort()
#Methode zur aufsteigenden Sortierung der Liste
>>>print li
7
1209
Hinweis zu zwei oben benutzten Listenmethoden:
extend … Erweiterung einer Liste mit Elementen aus Listen, Tupeln, Strings usw.
append … Erweiterung einer Liste um ein Element
-----c)
Definition (nutzer-)eigener Klassen:
- Definition einer Klasse mit dem Schlüsselwort class
- Objekte (Instanzen) einer Klasse werden durch Aufruf der Klasse erzeugt, wobei die Argumente denen
des Konstruktors der Klasse– aber ohne dessen erstes Argument self - entsprechen.
- (Objekt-) Attribute der Klasse werden durch die Konstruktormethode __init__ der Klasse initialisiert;
die Konstruktormethode wird bei der Erzeugung einer Instanz automatisch aufgerufen.
Die Konstrutormethode __init__ darf keine return-Anweisung enthalten. Bei Methoden mit voran- und
nachgestellten doppelten Unterstrichen handelt es sich um überladene Methoden - siehe Vorlesung.
Attribute bestehen aus einem Attributnamen und einem Attributwert. Alle Objekte einer Klasse besitzen
die gleichen Objektattribute, aber möglicherweise unterschiedliche Objektattributwerte.
Bemerkung: Bei Klassenattributen ist die Wertbelegung für alle Objekte einer Klasse gleich.
- das erste Argument des Konstruktors sollte stets self sein, womit das neue Objekt referenziert wird.
- Kurze Übung im interaktiven Modus der IDLE zu (nutzer-)eigenen Klassen:
>>>class Student:
#Definition einer Klasse Student
def __init__(self,n,m):
#Konstruktor(-methode) der Klasse
self.fullName = n
#Initialisierung des (Objekt-)Attributs fullName
self.matrikel = m
#Initialisierung eines weiteren (Objekt-)Attributs
def setMatrikel(self,num):
#Def. einer Methode der Klasse
self.matrikel = num
def getMatrikel(self):
#Def. einer Methode der Klasse
return self.matrikel
>>>print type(Student)
>>>stud1 = Student("Karl Kunze",44544) #Erzeugung der Instanz stud1
>>>print type(stud1)
>>>print stud1.fullName
#Ausgabe eines Attributs
>>>print stud1.matrikel
>>>stud1.setMatrikel(44545) #Methodenaufruf (Senden einer Botschaft)
>>>print stud1.getMatrikel()
>>>stud2 = Student ("Dieter Krause",39788)
#Zweite Instanz (Objekt)
>>>print stud2.fullName, stud2.matrikel
-----------------------------------------------------------------------------------------------------------------------------
8
1209
Herunterladen