Kapitel 03

Methoden & Verhalten: Wenn Objekte lebendig werden ⚔️

Lass Objekte aktiv handeln und miteinander interagieren anhand eines vollständigen Rennspiel- & Duell-Beispiels.

📂 Dateien dieser Einheit:
📄 aufgabe.py (Startercode) 🧪 test_aufgabe.py (Tests) 💡 musterloesung.py (Lösung) 📖 README.md

1. Was sind Methoden?

Bisher haben unsere Klassen vor allem Daten gespeichert. Aber in der echten Programmierung haben Objekte auch Verhalten (sie können etwas tun). Funktionen, die innerhalb einer Klasse stehen, nennt man Methoden.

💡 Der Unterschied zwischen Funktion und Methode:
  • Eine Funktion steht frei im Code: berechne_summe(a, b)
  • Eine Methode gehört zu einem Objekt und wird mit Punkt aufgerufen: mein_held.angreifen(gegner)

2. 🏎️ Vollständiges Beispiel: Die Rennauto-Klasse

Hier siehst du eine vollständige Klasse mit Konstruktor, mehreren Methoden, Wertebegrenzung (Tankinhalt) und einer Renn-Simulation:

Python (Komplettes Beispiel: rennauto.py)
class Rennauto:
    def __init__(self, fahrer, speed, tank=50):
        self.fahrer = fahrer
        self.speed = speed          # z.B. 220 km/h
        self.tank = tank            # Aktueller Tank in Litern
        self.max_tank = tank        # Maximales Tankvolumen
        self.gefahrene_km = 0

    # Methode 1: Fahren (verbraucht Benzin)
    def fahren(self, km):
        verbrauch = km * 0.2  # 0.2 Liter pro km
        if self.tank >= verbrauch:
            self.tank -= verbrauch
            self.gefahrene_km += km
            return f"{self.fahrer} fährt {km} km (Tank: {self.tank:.1f}L übrig)"
        else:
            return f"{self.fahrer} hat nicht genug Sprit für {km} km!"

    # Methode 2: Tanken (nicht über max_tank)
    def tanken(self, liter):
        freier_platz = self.max_tank - self.tank
        getankt = min(freier_platz, liter)
        self.tank += getankt
        return f"{self.fahrer} tankt {getankt:.1f} Liter nach (Tank: {self.tank:.1f}/{self.max_tank}L)"

    # Methode 3: Interaktion mit einem anderen Auto
    def duell_gegen(self, gegner_auto):
        if self.speed > gegner_auto.speed:
            return f"{self.fahrer} überholt {gegner_auto.fahrer} mit Leichtigkeit!"
        elif self.speed < gegner_auto.speed:
            return f"{gegner_auto.fahrer} zieht an {self.fahrer} vorbei!"
        else:
            return f"{self.fahrer} und {gegner_auto.fahrer} sind genau gleich schnell!"


# Ausprobieren:
if __name__ == "__main__":
    auto1 = Rennauto("Max", speed=240, tank=40)
    auto2 = Rennauto("Lewis", speed=235, tank=50)

    print(auto1.fahren(100))         # Verbraucht 20 Liter -> 20L übrig
    print(auto1.duell_gegen(auto2))   # Max ist schneller als Lewis!
    print(auto1.tanken(30))          # Tankt bis max 40L auf

3. 🤝 Interaktion: Ein Objekt übergibt sich an ein anderes

In der Methode angreifen(self, gegner) übergibst du das gegnerische Held-Objekt als Parameter:

⚔️ Wie das Helden-Duell funktioniert:
ritter.angreifen(drache)

1. self ist der Ritter (mit self.angriffskraft).
2. gegner ist der Drache.
3. Der Ritter ruft: gegner.schaden_erleiden(self.angriffskraft) auf!
4. Der Drache verliert Leben und prüft, ob er noch lebt.

4. 🎯 Deine Aufgaben in aufgabe.py

💡 Lösungshinweise (Aufklappen bei Bedarf)

🔍 Tipp zu TODO 4 (Angriff)
def angreifen(self, gegner):
    if self.ist_am_leben and gegner.ist_am_leben:
        gegner.schaden_erleiden(self.angriffskraft)
        return True
    return False

5. 🧪 Lösung überprüfen

Führe im Terminal im Ordner 03_methoden_und_verhalten folgenden Befehl aus:

Terminal
python3 test_aufgabe.py