Kapitel 05

Komposition: Objekte kombinieren & filtern 🎵

Baue einen eigenen Spotify-Playlist-Manager und lerne, wie Objekte andere Objekte suchen, berechnen und filtern.

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

1. Was ist Komposition?

In großen Anwendungen (wie Spotify, Netflix oder Schulsoftware) arbeiten viele Klassen zusammen. Wenn eine Klasse Objekte einer anderen Klasse als Attribute speichert, nennt man das Komposition (oder *"hat-ein"-Beziehung*):

  • Eine Schulklasse hat viele Schüler.
  • Eine Playlist hat viele Songs.
  • Ein Kino hat viele Säle.

2. 🎒 Vollständiges Beispiel: Schüler & Schulklasse Notenmanager

Hier siehst du ein vollständiges Beispiel aus dem Schulalltag: Die Klasse Schueler speichert Name und Note. Die Klasse Schulklasse verwaltet alle Schüler, berechnet den Notendurchschnitt und sucht die Klassenbesten:

Python (Komplettes Beispiel: schulklasse.py)
# ==============================================================================
# KLASSE 1: Ein einzelner Schüler
# ==============================================================================
class Schueler:
    def __init__(self, name, note):
        self.name = name
        self.note = float(note)

    def __str__(self):
        return f"{self.name} (Note: {self.note:.1f})"


# ==============================================================================
# KLASSE 2: Die Schulklasse verwaltet viele Schüler-Objekte
# ==============================================================================
class Schulklasse:
    def __init__(self, klassen_name):
        self.klassen_name = klassen_name
        self.schueler_liste = []

    def hinzufuegen(self, schueler):
        self.schueler_liste.append(schueler)

    def notendurchschnitt(self):
        if not self.schueler_liste:
            return 0.0
        summe = sum(s.note for s in self.schueler_liste)
        return summe / len(self.schueler_liste)

    def beste_schueler(self):
        # Findet alle Schüler mit einer 1 (Note <= 1.5)
        return [s for s in self.schueler_liste if s.note <= 1.5]


# Ausprobieren:
if __name__ == "__main__":
    klasse_9a = Schulklasse("Klasse 9a")

    s1 = Schueler("Emma", 1.0)
    s2 = Schueler("Lukas", 2.3)
    s3 = Schueler("Mia", 1.3)

    klasse_9a.hinzufuegen(s1)
    klasse_9a.hinzufuegen(s2)
    klasse_9a.hinzufuegen(s3)

    print(f"Durchschnitt: {klasse_9a.notendurchschnitt():.2f}")  # 1.53

    print("\nBeste Schüler:")
    for einserschueler in klasse_9a.beste_schueler():
        print(f"- {einserschueler}")

3. Nützliche Kniffe für die Song-Aufgabe

⏱️ Sekunden in "MM:SS" umrechnen

minuten = self.dauer_sekunden // 60
sekunden = self.dauer_sekunden % 60
return f"{minuten:02d}:{sekunden:02d}"  # z.B. "03:35"

🔍 Groß- und Kleinschreibung beim Suchen ignorieren

if song.kuenstler.lower() == kuenstler.lower():
    treffer.append(song)

4. 🎯 Deine Aufgaben in aufgabe.py

💡 Lösungshinweise (Aufklappen bei Bedarf)

🔍 Tipp zum längsten Song finden
def laengster_song(self):
    if not self.songs:
        return None
    
    bester_song = self.songs[0]
    for s in self.songs:
        if s.dauer_sekunden > bester_song.dauer_sekunden:
            bester_song = s
    return bester_song

5. 🧪 Lösung überprüfen

Führe im Terminal im Ordner 05_objekte_kombinieren folgenden Befehl aus:

Terminal
python3 test_aufgabe.py