Klassen und Objekte
Listing "Klasse Medium"
Objekte vereinen zusammengehörige Eigenschaften und Funktionen. (Manche bevorzugen es, bei Funktionen, die zu Klassen oder Objekten gehören, von Methoden zu sprechen. Ich persönlich halte diese Unterscheidung für wenig hilfreich und verwende sie nicht.)
Klassen sind Baupläne von Objekten.
Angenommen, du möchtest ein Programm für eine Bücherei schreiben. Dann könnte ein erster Entwurf für eine Klasse für Medien (also Bücher, Filme, Comics...) so aussehen.
Die Funktion __init__()
ist der sogenannte Konstruktor. Der wird immer aufgerufen, wenn du ein neues Objekt der Klasse Medium
erzeugst, etwa indem du m1 = Medium("Franz Kafka", "Das Schloß")
ausführst. Sie erwartet zwei Argumente: urheber
und titel
. Das Argument self
verweist immer auf das Objekt selbst, in diesem Fall m1
. Es muss bei der Anwendung des Konstruktors nicht hingeschrieben werden.
Die Funktion kommentiere
hängt jeweils einen Kommentar in die Liste self.kommentare
an.
class Medium:
def __init__(self, urheber, titel):
self.urheber = urheber
self.titel = titel
self.kommentare = []
def kommentiere(self, kommentar):
self.kommentare.append(kommentar)
m1 = Medium("Franz Kafka", "Das Schloß")
m1.kommentiere("Ein düsteres, aber interessantes Buch!")
m1.kommentiere("Ich kann damit nichts anfangen.")
m1.kommentiere("Weltliteratur vom feinsten.")
print(m1.kommentare)
#=> ['Ein düsteres, aber interessantes Buch!', 'Ich kann damit nichts anfangen.', 'Weltliteratur vom feinsten.']
m2 = Medium("Chris Buck, Jennifer Lee", "Die Eiskönigin")
m2.kommentiere("Ein wunderschöner Film mit tollen Songs!")
m2.kommentiere("Die Charaktere sind liebenswert und gut gemacht.")
m2.kommentiere("Mir ist das zu kitschig.")
print(m2.kommentare)
#=> ['Ein wunderschöner Film mit tollen Songs!', 'Die Charaktere sind liebenswert und gut gemacht.', 'Mir ist das zu kitschig.']
Listing "Vererbung"
In manchen Fällen ist es sinnvoll, zunächst eine Basisklasse zu definieren, von der dann andere Klassen erben können. In diesem Beispiel definiert die Basisklasse Medium die Eigenschaften urheber und titel und die funktion kommentiere.
Die Klassen Buch
und Film
erben von der Basisklasse Medium
, und fügen aber unterschiedliche Eigenschaften (dauer
und seitenzahl
) hinzu.
super.__init__()
verweist auf den Konstruktor der Basisklasse.
class Medium:
def __init__(self, urheber, titel):
self.urheber = urheber
self.titel = titel
self.kommentare = []
def kommentiere(self, kommentar):
self.kommentare.append(kommentar)
# Definition, der Klasse Buch, die von Medium erbt:
class Buch(Medium):
def __init__(self, urheber, titel, seitenzahl):
super().__init__(urheber, titel)
self.seitenzahl = seitenzahl
# Definition, der Klasse Film, die von Medium erbt:
class Film(Medium):
def __init__(self, urheber, titel, dauer):
super().__init__(urheber, titel)
self.dauer = dauer
m1 = Buch("Franz Kafka", "Das Schloß", 368)
print(m1.seitenzahl)
#=> 368
m2 = Film("Chris Buck, Jennifer Lee", "Die Eiskönigin", 102)
print(m2.dauer)
#=> 102