Objektorientierte Programmierung

Wie professioneller Code aussieht, wenn er nicht in einer langen Datei lebt.

Grundlagen 13 min Einsteiger 26. April 2026

Du verwendest Objekte, seit du deine erste Zeile Python geschrieben hast. "Hallo" ist ein Objekt der Klasse str, [1, 2, 3] ist ein Objekt der Klasse list, und jedes Mal, wenn du .append() oder .upper() aufgerufen hast, hast du eine Methode auf einem Objekt ausgeführt. Objektorientierte Programmierung (OOP) ist das System dahinter: Es bündelt Daten und die Operationen, die zu ihnen gehören, in wiederverwendbare Einheiten.

Wenn du PyTorch, Hugging Face oder scikit-learn öffnest, ist alles, womit du arbeitest — Modelle, Tokenizer, Optimierer — ein Objekt, das aus einer Klasse erstellt wurde. OOP zu verstehen verwandelt kryptische Bibliotheksdokumentation in etwas, das du tatsächlich lesen kannst.

Die Klasse: Ein Bauplan für Objekte

Klasse

AnalogieDefinition
Eine Klasse ist wie der Bauplan eines Autoherstellers für ein bestimmtes Modell. Der Bauplan legt fest, dass jedes Auto eine Farbe, eine Motorleistung und eine Fahrgestellnummer hat — und dass jedes Auto beschleunigen und bremsen kann. Aber der Bauplan selbst fährt nicht — er beschreibt nur, was die Autos können werden, die nach ihm gebaut werden.

Die Bauplan-Analogie bricht an drei Stellen: (1) Software-Klassen können von anderen Klassen erben — physische Baupläne nicht. (2) Python-Objekte können zur Laufzeit neue Attribute bekommen — als würde ein Auto plötzlich Flügel wachsen. (3) Ein neues Software-Objekt zu erstellen kostet fast nichts, ein neues Auto zu bauen ist teuer.

Wie ein Objekt entsteht

1
Code erreicht Hund("Bello", "Labrador")
2
Python erstellt ein leeres Objekt im Speicher
3
Python ruft __init__(neues_objekt, "Bello", "Labrador") auf
4
self.name = "Bello" und self.rasse = "Labrador" werden gesetzt
5
Fertiges Objekt wird zurückgegeben und in mein_hund gespeichert

Beispiel: Eine Hund-Klasse

class Hund:
    def __init__(self, name, rasse):
        self.name = name      # Attribut
        self.rasse = rasse    # Attribut

    def bellen(self):          # Methode
        print(f"Wuff! Ich bin {self.name}")

mein_hund = Hund("Bello", "Labrador")
mein_hund.bellen()  # Ausgabe: Wuff! Ich bin Bello

class definiert den Bauplan. __init__ richtet jedes neue Objekt ein. self verweist immer auf das konkrete Objekt, das gerade erstellt oder verwendet wird. Attribute (self.name) speichern Daten am Objekt. Methoden (bellen) definieren das Verhalten.

Häufiger Fehler: self vergessen

Wenn du self in der Methodensignatur vergisst, bekommst du eine verwirrende Fehlermeldung. Python übergibt das Objekt automatisch als erstes Argument — ohne self erwartet die Methode null Argumente, bekommt aber eines.

class Hund:
    def bellen():  # self fehlt!
        print("Wuff!")

mein_hund = Hund()
mein_hund.bellen()
# TypeError: bellen() takes 0 positional
# arguments but 1 was given

Das Objekt: Eine lebendige Instanz

Objekt

AnalogieDefinition
Wenn die Klasse "VW Golf" (das Modell) ist, dann ist das Objekt der konkrete rote Golf vor deinem Haus mit 23.456 km auf dem Tacho und einem Kratzer an der linken Tür. Fünf Golfs aus derselben Fabrik sind fünf unabhängige Objekte, die denselben Bauplan teilen, aber unterschiedlichen Kilometerstand, verschiedene Schäden und verschiedene Besitzer haben.

Die Auto-Analogie bricht, weil: (1) Software-Objekte am Programmende zerstört werden — echte Autos bleiben physisch bestehen. (2) Objekte können ihre eigene Klasse abfragen (type(hund1)), während Autos ihren Bauplan nicht "kennen". (3) Objekte können trivial kopiert werden — einen perfekten Auto-Klon zu erstellen ist unmöglich.

Klasse (Bauplan)

Definiert Struktur und Verhalten. Handelt nicht selbst. Hund beschreibt, was Hunde können — aber Hund bellt nicht.

Objekt (Instanz)

Hat eigene Daten und führt Methoden aus. mein_hund hat den Namen "Bello" und kann bellen().

Instanz-Unabhängigkeit

hund1 = Hund("Bello", "Labrador")
hund2 = Hund("Rex", "Schäferhund")

print(hund1.name)  # Bello
print(hund2.name)  # Rex

hund1.name = "Wuffi"
print(hund1.name)  # Wuffi
print(hund2.name)  # Rex  (unverändert!)

Jedes Objekt hat seine eigenen Attributwerte. hund1.name zu ändern hat keinen Einfluss auf hund2.name — sie sind unabhängige Kopien des Bauplans. Das ist das Kernprinzip: Objekte teilen die Struktur, aber nicht die Daten.

Warum OOP in jeder KI-Bibliothek steckt

Die drei großen KI-Bibliotheken — PyTorch, Hugging Face Transformers und scikit-learn — sind komplett auf Klassen und Objekten aufgebaut. Du musst keine eigenen Klassen schreiben, um KI zu nutzen — aber du musst verstehen, dass du Objekte verwendest und Methoden auf ihnen aufrufst.

PyTorch

Jedes Modell erbt von nn.Module. Die Klasse definiert Schichten in __init__ und Datenfluss in forward(). model = nn.Linear(10, 5) erstellt ein Objekt mit .weight und .bias Attributen.

Hugging Face

GPT2Model.from_pretrained("gpt2") ist eine Klassenmethode, die ein Objekt erstellt und vortrainierte Gewichte lädt. Das Objekt kann dann wie eine Funktion aufgerufen werden: model(**inputs).

scikit-learn

clf = DecisionTreeClassifier() erstellt ein Objekt. clf.fit(X, y) trainiert es — der gelernte Zustand wird im Objekt gespeichert. clf.predict(X_test) nutzt diesen Zustand für Vorhersagen.

Das Muster ist überall gleich: import macht die Klasse verfügbar, der Konstruktor (oder eine Factory-Methode) erstellt ein Objekt, und Methodenaufrufe nutzen oder verändern den Zustand des Objekts. Wenn du .fit(), .predict() oder .forward() liest, liest du Methodenaufrufe auf Objekten.

Nicht alles braucht eine Klasse

OOP zu verstehen heißt nicht, alles in Klassen zu packen. Einfache Skripte funktionieren perfekt mit Funktionen. Verwende Klassen, wenn du wiederverwendbare, zustandsbehaftete Einheiten brauchst — nicht als Selbstzweck.

Attribute, die direkt in der Klasse definiert werden (außerhalb von __init__), werden von allen Instanzen geteilt. Attribute, die in __init__ über self gesetzt werden, gehören dem einzelnen Objekt.

class Hund:
    art = "Canis lupus familiaris"  # Klassenattribut

    def __init__(self, name):
        self.name = name  # Instanzattribut

hund1 = Hund("Bello")
hund2 = Hund("Rex")
print(hund1.art)   # Canis lupus familiaris
print(hund2.art)   # Canis lupus familiaris (geteilt!)
print(hund1.name)  # Bello (individuell)

Vorsicht bei veränderbaren Klassenattributen! Eine Liste als Klassenattribut wird von allen Instanzen geteilt — Änderungen durch ein Objekt betreffen alle anderen. Faustregel: Veränderbare Daten (Listen, Dictionaries) immer in __init__ als Instanzattribute definieren.

class MeinModell(nn.Module) bedeutet: MeinModell IST ein nn.Module mit zusätzlichen Funktionen. Das Kind erbt alle Methoden und Attribute des Elternteils und kann eigene hinzufügen oder vorhandene überschreiben.

import torch.nn as nn

class MeinModell(nn.Module):
    def __init__(self):
        super().__init__()  # Eltern-Init aufrufen
        self.schicht = nn.Linear(10, 5)

    def forward(self, x):
        return self.schicht(x)

So funktioniert jedes benutzerdefinierte PyTorch-Modell. Vererbung, Polymorphismus und Methodenüberschreibung werden in späteren Artikeln ausführlich behandelt.

Interaktiv: Die OOP-Landkarte

Klicke auf die Konzepte in der Concept Map, um ihre Verbindungen zu erkunden. Beobachte, wie Klasse und Objekt zusammenhängen, wie Methoden und Attribute definiert und genutzt werden — und wo Vererbung ins Spiel kommt. Achte besonders darauf, wie viele Verbindungen von der Klasse ausgehen.

Klicke auf einen Begriff, um mehr zu erfahren. Die Linien zeigen, wie die Konzepte zusammenhängen.
erzeugtdefiniertdefinierthat Werte fürruft auferweitertnutzt / ändertKlasseObjektMethodeAttributVererbung

Klicke auf einen Kreis, um Details zu sehen.

Legende

Klasse
Objekt
Methode
Attribut
Vererbung

Das Wichtigste auf einen Blick

  1. Eine Klasse ist ein Bauplan: Sie definiert, welche Attribute (Daten) und Methoden (Verhalten) jede Instanz haben wird — aber sie ist selbst kein Objekt im Alltagssinn.
  2. Ein Objekt ist eine lebendige Instanz einer Klasse. Du erstellst es, indem du den Klassennamen wie eine Funktion aufrufst: mein_hund = Hund("Bello", "Labrador").
  3. Jedes Objekt hat eigene Attributwerte. hund1.name zu ändern beeinflusst hund2.name nicht — sie sind unabhängige Kopien des Bauplans.
  4. __init__ richtet den Anfangszustand eines neuen Objekts ein. self verweist auf das konkrete Objekt, das gerade erstellt oder verwendet wird. Beides sind Konventionen, keine Magie.
  5. KI-Bibliotheken (PyTorch, Hugging Face, scikit-learn) sind auf Klassen und Objekten aufgebaut. .fit(), .predict() und .forward() als Methodenaufrufe auf Objekten zu lesen ist der Schlüssel zur Nutzung.

Quiz: Objektorientierte Programmierung

Frage 1 / 4
Noch offen

Was ist der Unterschied zwischen einer Klasse und einem Objekt?

Wählen Sie eine Antwort
Auflösung: 1) B · 2) C · 3) B · 4) B

Checkpoint: Teste dein Wissen

  • Was ist der Unterschied zwischen einer Klasse und einem Objekt? Beim Hund-Beispiel mit mein_hund = Hund("Bello", "Labrador") — was ist die Klasse und was das Objekt?
  • Können zwei Objekte derselben Klasse unterschiedliche Attributwerte haben? Erkläre am Beispiel, warum hund1.name = "Wuffi" das Attribut von hund2 nicht verändert.
  • Wenn du model = GPT2Model.from_pretrained("gpt2") schreibst: Welche Rolle spielen import, die Klassendefinition und das resultierende model-Objekt jeweils?