Kapitel 02

Der Konstruktor __init__ & das geheimnisvolle self 💳

Lerne, wie Objekte direkt beim Erstellen startklar gemacht werden und baue eine Taschengeld-Konto App.

1. Warum brauchen wir __init__?

In Kapitel 01 mussten wir jedes Attribut mühsam von Hand setzen:

bello = Haustier()
bello.name = "Bello"
bello.alter = 3  # Was passiert, wenn man hier das Alter vergisst? -> Programm stürzt ab!

Deshalb gibt es den Konstruktor __init__. Er wird von Python automatisch aufgerufen, sobald ein neues Objekt erstellt wird!

🏗️ Die Geburtsurkunde-Analogie:
Wenn ein neues Objekt "geboren" wird, muss es sofort seine grundlegenden Daten erhalten (Name, Startwert). __init__ ist wie das Ausfüllen des Datenblattes bei der Geburt – danach ist das Objekt sofort einsatzbereit!

2. Was bedeutet self?

Das Wörtchen self steht auf Deutsch für "ich selbst" bzw. "dieses konkrete Objekt hier".

Python
class Bankkonto:
    def __init__(self, inhaber, kontostand=0.0):
        self.inhaber = inhaber          # Speichere 'inhaber' im Attribut DIESES Objekts
        self.kontostand = kontostand    # Speichere 'kontostand' in MEINEM Speicher

# Verwendung:
konto_anna = Bankkonto("Anna", 50.0)
konto_ben = Bankkonto("Ben")          # Verwendet den Standardwert 0.0
💡 Warum self.inhaber = inhaber?
Links vom Gleichheitszeichen steht self.inhaber – das ist die Variable, die am Objekt dauerhaft gespeichert bleibt. Rechts steht inhaber – das ist nur der temporäre Übergabeparameter der Funktion.

3. Häufige Stolperfallen beim Konstruktor

⚠️ Fehler 1: Doppel-Unterstrich vs. Einzel-Unterstrich
Es heißt __init__ mit zwei Unterstrichen davor und danach (Dunder), NICHT _init_! Wenn du nur einen Unterstrich schreibst, ignoriert Python die Methode einfach.
⚠️ Fehler 2: self im Methodenkopf vergessen
Jede Methode in einer Klasse muss als allerersten Parameter self haben:
def einzahlen(self, betrag):  ✓
def einzahlen(betrag):  ✗ (Führt zu TypeError!)

4. Deine Aufgaben in aufgabe.py

Öffne die Datei 02_init_und_self/aufgabe.py:

💡 Lösungshinweise (Aufklappen bei Bedarf)

Tipp zu TODO 3 (Auszahlen mit Absicherung)
def auszahlen(self, betrag):
    if betrag > 0 and self.kontostand >= betrag:
        self.kontostand -= betrag
        return True
    return False

5. Lösung überprüfen

Führe im Terminal im Ordner 02_init_und_self folgenden Befehl aus:

Terminal
python3 test_aufgabe.py