Objektorientierte Programmierung in Python: Klassen und Objekte
Klassen und Objekte sind das Herzstück der objektorientierten Programmierung. Lerne, wie du eigene Datentypen mit Attributen und Methoden baust.
Bisher hast du Daten in Listen, Dictionaries und einzelnen Variablen verwaltet. Doch was, wenn du komplexere Dinge der echten Welt abbilden möchtest – ein Auto, einen Benutzer oder ein Konto, das sowohl Daten als auch Verhalten besitzt? Genau dafür gibt es die objektorientierte Programmierung (OOP). Mit Klassen erschaffst du eigene Datentypen, die Daten (Attribute) und Funktionen (Methoden) sinnvoll bündeln. In diesem Beitrag lernst du die Grundlagen von Klassen und Objekten in Python.
Klasse und Objekt: der Unterschied
Eine Klasse ist wie ein Bauplan, ein Objekt ist ein konkretes Exemplar davon. Stell dir die Klasse als Backform vor und die Objekte als die einzelnen Kuchen, die du damit backst. Eine Klasse definierst du mit dem Schlüsselwort class:
class Hund:
pass # noch leer
# Zwei Objekte (Instanzen) der Klasse erzeugen
bello = Hund()
rex = Hund()
print(type(bello)) # <class '__main__.Hund'>Konventionell schreibt man Klassennamen groß (Hund). Mit Hund() erstellst du ein neues Objekt. bello und rex sind zwei unabhängige Instanzen derselben Klasse.
Der Konstruktor __init__
Damit jedes Objekt eigene Daten bekommt, nutzt du die spezielle Methode __init__(), den sogenannten Konstruktor. Er wird automatisch aufgerufen, wenn ein Objekt erzeugt wird. Der erste Parameter ist immer self und verweist auf das gerade entstehende Objekt.
class Hund:
def __init__(self, name, rasse):
self.name = name # Attribut speichern
self.rasse = rasse
bello = Hund("Bello", "Labrador")
rex = Hund("Rex", "Schäferhund")
print(bello.name) # Bello
print(rex.rasse) # SchäferhundÜber self.name speicherst du den übergebenen Wert dauerhaft im Objekt. Jedes Objekt hat damit seine eigenen Attribute, die du mit der Punkt-Schreibweise (bello.name) ausliest.
Methoden: Verhalten der Objekte
Klassen können nicht nur Daten speichern, sondern auch Funktionen enthalten. Solche Funktionen innerhalb einer Klasse nennt man Methoden. Auch sie bekommen self als ersten Parameter, damit sie auf die Attribute des Objekts zugreifen können.
class Hund:
def __init__(self, name):
self.name = name
def bellen(self):
return f"{self.name} sagt: Wuff!"
def stell_dich_vor(self):
return f"Ich bin {self.name}."
bello = Hund("Bello")
print(bello.bellen()) # Bello sagt: Wuff!
print(bello.stell_dich_vor()) # Ich bin Bello.Beim Aufruf bello.bellen() übergibt Python das Objekt automatisch als self – du musst es nicht selbst angeben. So kann die Methode auf self.name zugreifen.
Attribute verändern
Objekte sind veränderbar. Methoden können die Attribute ihres Objekts anpassen. Hier ein Beispiel mit einem Konto, dessen Kontostand sich durch Ein- und Auszahlungen ändert:
class Konto:
def __init__(self, inhaber, stand=0):
self.inhaber = inhaber
self.stand = stand
def einzahlen(self, betrag):
self.stand += betrag
def auszahlen(self, betrag):
if betrag > self.stand:
print("Nicht genug Guthaben!")
else:
self.stand -= betrag
konto = Konto("Anna", 100)
konto.einzahlen(50)
konto.auszahlen(30)
print(konto.stand) # 120Der Parameter stand=0 zeigt, dass du auch Standardwerte vergeben kannst. So lässt sich ein Konto mit oder ohne Startguthaben erzeugen.
Die __str__-Methode für schöne Ausgaben
Wenn du ein Objekt direkt ausgibst, erhältst du standardmäßig eine wenig hilfreiche Meldung. Mit der speziellen Methode __str__() bestimmst du selbst, wie dein Objekt als Text dargestellt wird – sehr praktisch für übersichtliche Ausgaben.
class Konto:
def __init__(self, inhaber, stand=0):
self.inhaber = inhaber
self.stand = stand
def __str__(self):
return f"Konto von {self.inhaber}: {self.stand} Euro"
konto = Konto("Bernd", 250)
print(konto) # Konto von Bernd: 250 EuroOhne __str__() würde print(konto) nur etwas wie <__main__.Konto object at 0x...> ausgeben. Mit ihr bekommst du eine lesbare, aussagekräftige Darstellung.
Fazit
Mit Klassen und Objekten kannst du eigene Datentypen bauen, die Daten und Verhalten sinnvoll zusammenfassen. Du hast gelernt, was der Unterschied zwischen Klasse und Objekt ist, wie der Konstruktor __init__ jedem Objekt eigene Attribute gibt, wie Methoden über self auf diese Attribute zugreifen und wie __str__ für schöne Ausgaben sorgt. Objektorientierung wirkt am Anfang ungewohnt, wird aber schnell vertraut, wenn du eigene kleine Klassen schreibst – etwa für ein Auto, einen Spieler oder ein Produkt. Probiere es aus, und du wirst merken, wie übersichtlich sich größere Programme damit strukturieren lassen.