24.12.2014 Views

Presentation

Presentation

Presentation

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!