🧱 Klassen - Objektorientierte Programmierung in Python#
🚀 Warum brauchen wir objektorientierte Programmierung?#
In einfachen Programmen reicht es oft aus, einzelne Variablen und Funktionen zu verwenden. Doch je größer und komplexer ein Programm wird, desto schwieriger wird es, den Überblick zu behalten:
Was gehört logisch zusammen?
Wo werden Daten gespeichert, wie verarbeitet?
Wie kann ich Code mehrfach verwenden, ohne alles zu kopieren?
Hier kommt objektorientierte Programmierung ins Spiel – ein Konzept, das hilft, komplexe Programme besser zu strukturieren.
🧩 Was ist objektorientierte Programmierung?#
Objektorientierung bedeutet, dass wir Programme in kleine, eigenständige Bausteine unterteilen: Objekte.
Ein Objekt ist ein „Ding“ mit Eigenschaften und Fähigkeiten, zum Beispiel:
Ein Hund hat: einen Namen, ein Alter, ein Gewicht
Ein Hund kann: bellen(), fressen(), laufen()
In der OOP modellieren wir diese Dinge als Klassen – das sind Baupläne für Objekte.
🔑 Zentrale Vorteile von OOP#
Vorteil |
Erklärung |
---|---|
🔄 Wiederverwendbarkeit |
Einmal geschriebene Klassen können für viele Objekte genutzt werden |
🧱 Struktur & Ordnung |
Programmteile werden logisch gekapselt |
🔒 Kapselung |
Daten und Methoden sind zusammengefasst – keine globalen Variablen |
📈 Erweiterbarkeit |
Neue Funktionen lassen sich einfach hinzufügen |
👀 Lesbarkeit |
Klarere, selbstbeschreibende Programme |
🤝 Zusammenarbeit im Team |
Jeder arbeitet an eigenen Klassen – weniger Konflikte im Code |
🔧 Wie sieht objektorientierter Code aus?#
class Hund:
def __init__(self, name, alter):
self.name = name
self.alter = alter
def bellen(self):
print(f"{self.name} bellt!")
hund1 = Hund("Bello", 3)
hund1.bellen()
➡️ Hier passiert viel automatisch:
__init__()
erzeugt das Objektself
speichert die Eigenschaften im ObjektMethoden (wie bellen()) sind an das Objekt gebunden
🔹 Objekte erstellen (Instanziierung)#
mein_hund = Hund("Bello", 3)
dein_hund = Hund("Luna", 5)
mein_hund.bellen() # Bello bellt!
print(dein_hund.name) # Luna
🔹 Was ist self
?#
self
verweist immer auf das aktuelle Objekt. Es ist notwendig, um innerhalb der Klasse auf eigene Attribute oder Methoden zuzugreifen.
Muss explizit im Methodenkopf stehen, wird aber beim Aufruf automatisch übergeben
🔹 Weitere Methoden hinzufügen#
class Hund:
def __init__(self, name, gewicht):
self.name = name
self.gewicht = gewicht
def wiegen(self):
print(f"{self.name} wiegt {self.gewicht} kg.")
def fuettern(self, futtermenge):
self.gewicht += futtermenge * 0.1
✨ Dunder-Methoden für Python-Klassen#
Methode |
Zweck (automatisch aufgerufen, wenn…) |
---|---|
|
…ein Objekt erstellt wird (obj = Klasse(…)) |
|
…print(obj) oder str(obj) verwendet wird |
|
…das Objekt im Interpreter dargestellt wird |
|
…len(obj) aufgerufen wird |
|
…zwei Objekte verglichen werden (obj1 == obj2) |
|
…Vergleiche wie <, >, <=, >= |
|
…mit + gerechnet wird (obj1 + obj2) |
|
…Zugriff mit obj[index] erfolgt |
|
…Eintrag geändert wird obj[index] = wert |
🧱 Codebeispiel:#
class Datum:
def __init__(self, tag, monat, jahr):
self.tag = tag
self.monat = monat
self.jahr = jahr
def __repr__(self):
return f"{self.tag:02d}.{self.monat:02d}.{self.jahr}"
def __eq__(self, other):
return (self.tag == other.tag) and (self.monat == other.monat) and (self.jahr == other.jahr)
def __lt__(self, other):
if self.jahr < other.jahr:
return True
if self.jahr > other.jahr:
return False
if self.monat < other.monat:
return True
if self.monat > other.monat:
return False
if self.tag < other.Tag:
return True
return False
def __le__(self, other):
return self < other or self == other
def __gt__(self, other):
return not self <= other
def __ge__(self, other):
return not self < other
d1 = Datum(1, 1, 2023)
d2 = Datum(15, 3, 2023)
d3 = Datum(1, 1, 2023)
print(d1 == d3) # → True
print(d1 < d2) # → True
print(d2 > d1) # → True
print(sorted([d2, d1, d3])) # → [01.01.2023, 01.01.2023, 15.03.2023]