Presentation
Presentation
Presentation
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Sample: "Python Reference" Book<br />
Python Referenz<br />
Python Referenz<br />
3 Typen und Objekte<br />
Alle Daten eines Python-Programmes basieren auf dem Konzept eines Objektes. Objekte umfassen<br />
grundlegende Datentypen wie Zahlen, Zeichenketten, Listen und Dictionaries. Es ist auch möglich,<br />
benutzerdefinierte Datentypen in Form von Klassen oder Erweiterungstypen zu erstellen. Dieses Kapitel<br />
beschreibt das Objektmodell von Python und gibt eine Übersicht der eingebauten Datentypen. Kapitel 4,<br />
»Operatoren und Ausdrücke«, beschreibt weitere Operatoren und Ausdrücke.<br />
3.1 Terminologie<br />
Jedes Datum im Speicher ist ein Objekt. Jedes Objekt hat eine Identität, einen Typ und einen Wert.<br />
Wenn man z.B. a = 42 schreibt, wird ein Ganzzahl-Objekt mit dem Wert 42 erzeugt. Man kann die<br />
Identität eines Objektes als Zeiger auf einen Platz im Hauptspeicher betrachten. a ist der Name dieses<br />
Platzes.<br />
Der Typ eines Objektes (der seinerseits eine spezielle Art von Objekt ist) beschreibt die interne<br />
Repräsentation des Objektes wie auch die Methoden und Operationen, die es unterstützt. Wird ein<br />
Objekt eines bestimmten Typs erzeugt, so wird dieses Objekt manchmal als eine Instanz dieses Typs<br />
bezeichnet (obwohl eine Instanz eines Typs nicht mit einer Instanz einer benutzerdefinierten Klasse<br />
verwechselt werden sollte). Nachdem ein Objekt erzeugt wurde, können dessen Identität und Typ nicht<br />
mehr verändert werden. Falls dessen Wert jedoch verändert werden kann, so sagt man, das Objekt ist<br />
veränderlich. Falls der Wert nicht verändert werden kann, so spricht man entsprechend von einem<br />
unveränderlichen Objekt. Ein Objekt, das Verweise auf andere Objekte enthält, bezeichnet man als<br />
Container oder Sammlung.<br />
Zusätzlich zum Wert, den sie repräsentieren, definieren viele Objekte eine Anzahl von Datenattributen<br />
und Methoden. Ein Attribut ist eine mit dem Objekt assoziierte Eigenschaft oder ein Wert. Eine<br />
Methode ist eine Funktion, die eine gewisse Operation auf einem Objekt ausführt, sobald sie angestoßen<br />
wird. Attribute und Methoden werden mit dem Punkt-Operator (.) angesprochen, wie im folgenden<br />
Beispiel gezeigt wird:<br />
a = 3 + 4j<br />
r = a.real<br />
# Erzeuge eine komplexe Zahl.<br />
# Hole den Realteil (ein Attribut).<br />
b = [1, 2, 3] # Erzeuge eine Liste.<br />
b.append(7) # Füge ein neues Element an b<br />
# mit der Methode 'append' an.<br />
3.2 Identität und Typ von Objekten<br />
Die eingebaute Funktion id() gibt die Identität eines Objektes als ganzzahligen Wert zurück. Dieser<br />
entspricht normalerweise dem Platz des Objektes im Hauptspeicher, was aber abhängig von der<br />
Implementierung ist. Der Operator is vergleicht die Identität zweier Objekte. Die eingebaute Funktion<br />
type() gibt den Typ eines Objektes zurück, z.B:<br />
# Vergleiche zwei Objekte.<br />
def compare(a, b):<br />
print 'Die Identität von a ist ', id(a)<br />
print 'Die identität von b ist ', id(b)<br />
if a is b:<br />
print 'a und b sind dasselbe Objekt.'<br />
if a == b:<br />
print 'a und b haben den gleichen Wert.'<br />
if type(a) == type(b):<br />
print 'a und b haben den gleichen Typ.'<br />
Der Typ eines Objektes ist seinerseits ein Objekt. Das Standardmodul types beinhaltet die<br />
Typ-Objekte für alle eingebauten Typen und kann für eine Typ-Prüfung verwendet werden, z.B. so:<br />
import types<br />
if isinstance(s, types.ListType):<br />
print 'Ist eine Liste.'<br />
Benutzerdefinierte Funktionen sind aufrufbare Objekte, die auf Modulebene mit der Anweisung def<br />
oder der Operation lambda erzeugt werden (Funktionen, die innerhalb von Klassen definiert werden,<br />
nennt man Methoden. Sie werden in Kürze beschrieben). In Python sind Funktionen Bürger erster<br />
Klasse, die genauso behandelt werden wie alle anderen Python-Objekte. Daraus folgt, dass man sie an<br />
Variablen zuweisen oder sie in Listen, Tupel oder Dictionaries unterbringen kann, wie im folgenden<br />
Beispiel gezeigt wird:<br />
def foo(x, y):<br />
print '%s + %s ist %s' % (x, y, x+y)<br />
# Weise an eine neue Variable zu.<br />
bar = foo<br />
bar(3, 4)<br />
# Ruft 'foo' auf, oben definiert.<br />
# Setze foo in einen Container.<br />
d = {}<br />
d['callback'] = foo<br />
d['callback'](3, 4) # Ruft 'foo' auf.<br />
Eine benutzerdefinierte Funktion verfügt über folgende Attribute:<br />
Attribut(e)<br />
f.__doc__ oder<br />
f.func_doc<br />
f.__name__ oder<br />
f.func_name<br />
f.func_code<br />
f.func_defaults<br />
f.func_globals<br />
Beschreibung<br />
Dokumentations-String<br />
Funktionsname<br />
Byte-übersetzter Code<br />
Tupel mit voreingestellten Argumenten<br />
Dictionary, das den globalen Namensraum<br />
definiert<br />
Methoden sind Funktionen, die nur auf Objektinstanzen operieren. Üblicherweise werden Methoden<br />
innerhalb einer Klassendefinition definiert:<br />
# Eine Schlange von Objekten, nach Prioritäten sortiert.<br />
class PriorityQueue:<br />
def __init__(self):<br />
self.items = [ ]<br />
# Liste von (priority, item)<br />
def insert(self, priority, item):<br />
for i in range(len(self.items)):<br />
if self.items[i][0] > priority:<br />
self.items.insert(i, (priority, item))<br />
break<br />
else:<br />
self.items.append((priority, item))<br />
def remove(self):<br />
try:<br />
return self.items.pop(0)[1]<br />
except IndexError:<br />
raise RuntimeError, 'Schlange ist leer'<br />
Ein ungebundenes Methodenobjekt ist eine Methode, die noch nicht mit einem speziellen Instanzobjekt<br />
assoziiert wurde. Die Methoden in einer Klassendefinition sind solange ungebunden, bis sie einem<br />
speziellen Objekt hinzugefügt werden, z.B.:<br />
m = PriorityQueue.insert # Ungebundene Methode.<br />
Um eine ungebundene Methode aufzurufen, übergibt man eine Objektinstanz als erstes Argument:<br />
pq = PriorityQueue()<br />
m = PriorityQueue.insert<br />
m(pq, 5, "Python")<br />
# Ruft pq.insert(5, "Python") auf.<br />
Ein gebundenes Methodenobjekt ist eine Methode, die bereits mit einem speziellen Instanzobjekt<br />
assoziiert wurde, z.B.:<br />
27<br />
33<br />
Dynamic Documents with ReportLab and Zope, page 23 – © Dinu C. Gherman