71 lines
2.1 KiB
Markdown
71 lines
2.1 KiB
Markdown
# Kapitel 05: Komposition – Objekte kombinieren & filtern 🎵
|
||
|
||
In der echten Softwareentwicklung (wie bei Spotify, Instagram oder Netflix) besteht ein System fast immer aus vielen verschiedenen Klassen, die zusammenarbeiten.
|
||
|
||
Wenn eine Klasse andere Objekte besitzt oder verwaltet, nennt man das **Komposition** (oder *"hat-ein"-Beziehung*):
|
||
- Eine **Playlist** *hat viele* **Songs**.
|
||
- Ein **Kino** *hat viele* **Säle** und **Filme**.
|
||
- Eine **Schule** *hat viele* **Klassen** und **Schüler**.
|
||
|
||
---
|
||
|
||
## 🎶 Das Zusammenspiel: Song & Playlist
|
||
|
||
Schauen wir uns an, wie eine Playlist mit Songs arbeiten kann:
|
||
|
||
```python
|
||
class Song:
|
||
def __init__(self, titel, dauer_sekunden):
|
||
self.titel = titel
|
||
self.dauer_sekunden = dauer_sekunden
|
||
|
||
class Playlist:
|
||
def __init__(self, name):
|
||
self.name = name
|
||
self.songs = [] # Hier landen die Song-Objekte
|
||
|
||
def hinzufuegen(self, song):
|
||
self.songs.append(song)
|
||
|
||
def finde_lange_songs(self, min_sekunden):
|
||
gefundene = []
|
||
for song in self.songs:
|
||
if song.dauer_sekunden >= min_sekunden:
|
||
gefundene.append(song)
|
||
return gefundene
|
||
```
|
||
|
||
---
|
||
|
||
## ⏱️ Zeit-Formatierung: Aus Sekunden werden Minuten & Sekunden
|
||
|
||
Um z.B. `215` Sekunden als `"03:35"` darzustellen, teilt man mit Ganzzahldivision `//` und Modulo `%`:
|
||
```python
|
||
sekunden_gesamt = 215
|
||
minuten = sekunden_gesamt // 60 # 3
|
||
sekunden = sekunden_gesamt % 60 # 35
|
||
|
||
# Mit :02d wird immer zweistellig mit führender Null formatiert:
|
||
print(f"{minuten:02d}:{sekunden:02d}") # "03:35"
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Deine Aufgabe: Der Spotify-Playlist-Manager
|
||
|
||
In `aufgabe.py` baust du deine eigene Musikverwaltung:
|
||
1. **Klasse `Song`**:
|
||
- Attribute: `titel`, `kuenstler`, `dauer_sekunden`
|
||
- Methode: `formatierte_dauer()` -> `"MM:SS"`
|
||
- `__str__()` -> `"{titel}" von {kuenstler} ({MM:SS})`
|
||
2. **Klasse `Playlist`**:
|
||
- `song_hinzufuegen(song)`
|
||
- `anzahl_songs()`
|
||
- `gesamtdauer_sekunden()`
|
||
- `finde_songs_von(kuenstler)` (Groß-/Kleinschreibung ignorieren!)
|
||
- `laengster_song()` (liefert das Song-Objekt mit der längsten Dauer)
|
||
|
||
### Testen:
|
||
```bash
|
||
python3 test_aufgabe.py
|
||
```
|