Kapitel 05

Komposition: Objekte kombinieren & filtern 🎵

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

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*):

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