Aufgaben-Python/05_objekte_kombinieren/README.md

71 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```