Kapitel 01

Die erste Klasse: Bauplan vs. Objekt 🐶

Verstehe den Unterschied zwischen einer Klasse und einer Instanz anhand vollständiger Praxisbeispiele.

📂 Dateien dieser Einheit:
💻 In Web-IDE öffnen → 📄 aufgabe.py (Startercode) 🧪 test_aufgabe.py (Tests) 💡 musterloesung.py (Lösung) 📖 README.md

1. Die Grundidee: Bauplan vs. Echtes Objekt

In Python ist fast alles ein Objekt (Zahlen, Texte, Listen). Mit Klassen lernst du jetzt das mächtigste Werkzeug der Programmierung kennen: Deine eigenen Baupläne zu entwerfen!

🏗️ Die Plätzchenform-Analogie:

Stell dir das Backen in der Küche vor:

  • Die Klasse (class) ist die Ausstechform. Sie legt die Form fest (Kopf, Arme, Beine). Die Form selbst kann man nicht essen.
  • Das Objekt (Instanz) ist das echte Plätzchen, das du aus dem Teig ausstichst. Ein Plätzchen bekommt Schokoglasur, ein anderes bunte Streusel. Beide stammen aus derselben Form, sind aber zwei völlig eigenständige Plätzchen!

2. Warum machen Klassen deinen Code besser?

Schauen wir uns an, wie man Daten bisher mit Dictionaries gespeichert hat – und warum eine Klasse viel übersichtlicher und sicherer ist:

❌ Vorher: Mit Dictionaries (Fehleranfällig!)
# Hund 1 mit Dictionary
hund1 = {"name": "Bello", "rasse": "Labrador", "alter": 3}

# Hund 2: Ups! Hier haben wir uns beim Schlüssel vertippt ("tier_rasse" statt "rasse")!
hund2 = {"name": "Luna", "tier_rasse": "Pudel", "alter": 2}

# Wenn wir jetzt die Rasse ausgeben wollen:
print(hund1["rasse"])  # Funktioniert -> "Labrador"
print(hund2["rasse"])  # 💥 KeyError: 'rasse' existiert nicht! Programm stürzt ab!

Jetzt das Ganze mit einer Klasse:

✅ Nachher: Mit einer Klasse (Sauber & Einheitlich)
# 1. Wir definieren den gemeinsamen Bauplan:
class Hund:
    pass

# 2. Wir erstellen zwei konkrete Hunde (Instanzen):
bello = Hund()
bello.name = "Bello"
bello.rasse = "Labrador"
bello.alter = 3

luna = Hund()
luna.name = "Luna"
luna.rasse = "Pudel"
luna.alter = 2

# 3. Jetzt greifen wir mit der Punkt-Notation (.) auf die Eigenschaften zu:
print(bello.name, "ist ein", bello.rasse)  # Ausgabe: Bello ist ein Labrador
print(luna.name, "ist ein", luna.rasse)    # Ausgabe: Luna ist ein Pudel

3. 🌟 Vollständiges Praxisbeispiel: Der Fahrrad-Verleih

Hier siehst du ein vollständiges, funktionierendes Python-Skript von Anfang bis Ende. Schau dir genau an, wie Objekte erstellt, Eigenschaften zugewiesen und in Funktionen verwendet werden:

Python (Komplettes Beispiel: fahrrad_verleih.py)
# ==============================================================================
# SCHRITT 1: Die Klasse (der Bauplan) definieren
# ==============================================================================
class Fahrrad:
    pass


# ==============================================================================
# SCHRITT 2: Eine Funktion, die Fahrräder beschreibt
# ==============================================================================
def fahrrad_info(bike):
    # Wir greifen über den Punkt auf die Attribute des übergebenen Objekts zu:
    return f"{bike.marke} ({bike.farbe}) - {bike.gaenge} Gänge - {bike.preis_pro_tag}€/Tag"


# ==============================================================================
# SCHRITT 3: Eine Funktion, die prüft, welches Fahrrad günstiger ist
# ==============================================================================
def guenstigeres_rad(rad_a, rad_b):
    if rad_a.preis_pro_tag < rad_b.preis_pro_tag:
        return rad_a
    else:
        return rad_b


# ==============================================================================
# SCHRITT 4: Wir erzeugen konkrete Objekte und probieren alles aus!
# ==============================================================================
if __name__ == "__main__":
    # Erstes Fahrrad-Objekt erstellen:
    mountainbike = Fahrrad()
    mountainbike.marke = "Cube"
    mountainbike.farbe = "Schwarz/Grün"
    mountainbike.gaenge = 21
    mountainbike.preis_pro_tag = 25.0

    # Zweites Fahrrad-Objekt erstellen:
    citybike = Fahrrad()
    citybike.marke = "Gazelle"
    citybike.farbe = "Himmelblau"
    citybike.gaenge = 7
    citybike.preis_pro_tag = 15.0

    # Infos ausgeben:
    print("Verfügbare Räder:")
    print("1.", fahrrad_info(mountainbike))
    print("2.", fahrrad_info(citybike))

    # Günstigeres Rad finden:
    schnaeppchen = guenstigeres_rad(mountainbike, citybike)
    print(f"\nDas günstigere Rad ist das {schnaeppchen.marke} für nur {schnaeppchen.preis_pro_tag}€!")
💡 Was du hier sehen kannst:
mountainbike und citybike sind zwei getrennte Variablen im Arbeitsspeicher. Jedes hat seine eigenen Werte für .marke, .farbe und .preis_pro_tag, obwohl beide aus der Klasse Fahrrad stammen!

4. ⚠️ Häufige Stolperfallen für Einsteiger

1. Klammern beim Erstellen vergessen:
mein_rad = Fahrrad()  ✓ (Richtig: Erzeugt ein neues Objekt!)
mein_rad = Fahrrad  ✗ (Falsch: Speichert nur den Bauplan in die Variable!)
2. Groß- und Kleinschreibung:
Klassennamen beginnen in Python immer mit einem Großbuchstaben (Haustier, Fahrrad). Variablen und Funktionsnamen schreibt man klein (bello, erstelle_bello()).
3. 'return' in Funktionen vergessen:
Wenn eine Funktion ein Haustier bauen soll (wie erstelle_bello()), muss am Ende unbedingt return mein_tier stehen! Ohne return gibt Python automatisch None zurück.

5. 🎯 Deine Aufgaben in aufgabe.py

Öffne die Datei aufgabe.py in deinem Editor und bearbeite die Aufgaben:

💡 Lösungshinweise (Aufklappen, wenn du Hilfe brauchst)

🔍 Tipp zu TODO 1 & 2 (Klasse & Objekt erstellen)
class Haustier:
    pass

def erstelle_bello():
    tier = Haustier()          # 1. Neues Haustier-Objekt bauen
    tier.name = "Bello"        # 2. Attribute zuweisen
    tier.tierart = "Hund"
    tier.alter = 3
    return tier                # 3. Objekt zurückgeben!
🔍 Tipp zu TODO 5 (Tiere vergleichen)
def aelteres_tier(tier1, tier2):
    if tier2.alter > tier1.alter:
        return tier2
    else:
        return tier1

6. 🧪 Lösung überprüfen

Öffne das Terminal und führe den Test aus:

Terminal
python3 test_aufgabe.py