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.

Teilen
Objektorientierte Programmierung in Python: Klassen und Objekte

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)  # 120

Der 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 Euro

Ohne __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.