Python Schulung – Kursbezug
Merksatz: OOP ist am stärksten, wenn Sie Daten + Verhalten zusammenhalten (Attribute + Methoden) und Zustände kontrolliert ändern.
Worum geht’s?
- Sie erstellen Klassen mit
__init__, Attributen und Methoden. - Sie nutzen Kapselung (z.B. Validierung in Methoden / Properties).
- Sie setzen Vererbung ein (Basisklasse → Spezialisierung) und kennen Alternativen (Komposition).
- Sie verstehen dunder-Methoden (z.B.
__repr__) und dataclasses für „Datenobjekte“.
Lehr-/Lernziele
- (LZ1) Klassen/Objekte erklären und eine Klasse mit
__init__sauber instanziieren. - (LZ2) Methoden schreiben, Zustände ändern und einfache Validierung/Kapselung umsetzen.
- (LZ3) Vererbung mit
super()nutzen und dunder-Methoden (__repr__/__str__) sinnvoll einsetzen. - (LZ4) dataclasses für reine Datenobjekte einsetzen und den Unterschied zu „Logik-Klassen“ erklären.
Wie Sie die Ziele erreichen: Wir bauen einen kleinen Kurs-/Buchungs-Use-Case (Beispieldaten). Das Quiz prüft LZ1–LZ4. Im Mini-Projekt modellieren Sie Teilnehmer + Buchung + Rabattregel.
Klasse & Objekt (Basis)
Wir modellieren einen Kurs mit Namen, Format und Beispielpreis. Die Klasse liefert außerdem eine formatierte Ausgabe.
class Kurs:
def __init__(self, kurs_name, format, preis_euro):
self.kurs_name = kurs_name
self.format = format # "Online" oder "Praesenz"
self.preis_euro = preis_euro # Beispielwert
def kurztext(self):
return f"{self.kurs_name} | {self.format} | Preis (Beispiel): {self.preis_euro:.2f} EUR"
kurs = Kurs("Python Schulung", "Online", 1490.00)
print(kurs.kurztext())Methoden & Kapselung (Validierung)
class Buchung:
def __init__(self, kurs_name, preis_euro):
self.kurs_name = kurs_name
self.preis_euro = preis_euro # Beispielwert
self.rabatt_prozent = 0
def rabatt_setzen(self, rabatt_prozent):
# einfache Validierung/Kapselung
if rabatt_prozent < 0 or rabatt_prozent > 30:
raise ValueError("rabatt_prozent muss zwischen 0 und 30 liegen")
self.rabatt_prozent = rabatt_prozent
def endpreis(self):
return self.preis_euro * (1 - self.rabatt_prozent / 100)
def zusammenfassung(self):
return f"{self.kurs_name} | Rabatt: {self.rabatt_prozent}% | Endpreis (Beispiel): {self.endpreis():.2f} EUR"
buchung = Buchung("Python Schulung", 1490.00)
buchung.rabatt_setzen(10)
print(buchung.zusammenfassung())Optional: Property statt direktem Attributzugriff
class Buchung:
def __init__(self, kurs_name, preis_euro):
self.kurs_name = kurs_name
self.preis_euro = preis_euro
self._rabatt_prozent = 0
@property
def rabatt_prozent(self):
return self._rabatt_prozent
@rabatt_prozent.setter
def rabatt_prozent(self, wert):
if wert < 0 or wert > 30:
raise ValueError("rabatt_prozent muss zwischen 0 und 30 liegen")
self._rabatt_prozent = wert
b = Buchung("Python Schulung", 1490.00)
b.rabatt_prozent = 15
print(b.rabatt_prozent)Vererbung & super()
Wir unterscheiden Buchungen nach Format. Online hat z.B. einen Technik-Hinweis (Beispielregel).
class Buchung:
def __init__(self, kurs_name, preis_euro):
self.kurs_name = kurs_name
self.preis_euro = preis_euro
def hinweis(self):
return "Allgemeiner Hinweis: Bitte Unterlagen vorab lesen."
def __repr__(self):
return f"Buchung(kurs_name={self.kurs_name!r}, preis_euro={self.preis_euro!r})"
class OnlineBuchung(Buchung):
def __init__(self, kurs_name, preis_euro, meeting_link):
super().__init__(kurs_name, preis_euro)
self.meeting_link = meeting_link
def hinweis(self):
return "Online: Technik-Check (Audio/Video) vorab empfohlen."
b1 = Buchung("Python Schulung", 1490.00)
b2 = OnlineBuchung("Python Schulung", 1490.00, "https://beispiel-link.invalid")
print(b1.hinweis())
print(b2.hinweis())
print(repr(b2))dataclasses: Datenobjekte schnell & sauber
from dataclasses import dataclass
@dataclass
class Teilnehmer:
name: str
firma: str
erfahrungsjahre: int
tn = Teilnehmer(name="Max Beispiel", firma="Beispiel GmbH", erfahrungsjahre=2)
print(tn) # liefert automatisch eine sinnvolle DarstellungOptional: dataclass + Methode (kleine Logik)
from dataclasses import dataclass
@dataclass
class Teilnehmer:
name: str
erfahrungsjahre: int
def ist_einsteiger(self):
return self.erfahrungsjahre < 1
tn = Teilnehmer("Ada", 0)
print(tn.ist_einsteiger())Praxisaufgabe (Mini)
Sie modellieren eine kleine Buchung – mit Teilnehmer, Kurs und Rabattregel (Beispieldaten).
Beitrag zu den Lehr-/Lernzielen: LZ1 (Klasse/Objekt), LZ2 (Methoden/Validierung), LZ3 (repr/Vererbung optional), LZ4 (dataclass optional).
- (LZ1) Klasse
Kurs:kurs_name,format,preis_euro. - (LZ1/LZ2) Klasse
Buchung: hält Kurs +rabatt_prozent; Methodeendpreis(). - (LZ2) Validierung: Rabatt nur 0–30%.
- (LZ2) Ausgabe als f-String: Kurs + Format + Endpreis (Beispiel).
- (Bonus, LZ4) Teilnehmer als
@dataclass.
Lösungsvorschlag anzeigen
from dataclasses import dataclass
@dataclass
class Teilnehmer:
name: str
firma: str
class Kurs:
def __init__(self, kurs_name, format, preis_euro):
self.kurs_name = kurs_name
self.format = format
self.preis_euro = preis_euro
class Buchung:
def __init__(self, teilnehmer, kurs):
self.teilnehmer = teilnehmer
self.kurs = kurs
self.rabatt_prozent = 0
def rabatt_setzen(self, rabatt_prozent):
if rabatt_prozent < 0 or rabatt_prozent > 30:
raise ValueError("rabatt_prozent muss zwischen 0 und 30 liegen")
self.rabatt_prozent = rabatt_prozent
def endpreis(self):
return self.kurs.preis_euro * (1 - self.rabatt_prozent / 100)
def zusammenfassung(self):
ort = "remote" if self.kurs.format == "Online" else "Hamburg"
return (
f"TN: {self.teilnehmer.name} ({self.teilnehmer.firma}) | "
f"Kurs: {self.kurs.kurs_name} | Format: {self.kurs.format} | Ort: {ort} | "
f"Endpreis (Beispiel): {self.endpreis():.2f} EUR"
)
tn = Teilnehmer(name="Max Beispiel", firma="Beispiel GmbH")
kurs = Kurs(kurs_name="Python Schulung", format="Online", preis_euro=1490.00)
buchung = Buchung(teilnehmer=tn, kurs=kurs)
buchung.rabatt_setzen(10)
print(buchung.zusammenfassung())Optional: typische Stolperfallen
- self vergessen: Methoden brauchen als erstes Argument
self. - Zustand unkontrolliert ändern: lieber Methoden/Properties für Regeln (Validierung).
- Vererbung übertreiben: oft ist Komposition (Objekt enthält Objekt) einfacher.
- repr/str:
__repr__hilft beim Debuggen – kurz und eindeutig halten.
Kurz-Takeaways
- LZ1: Klasse = Bauplan, Objekt = Instanz mit Zustand.
- LZ2: Regeln in Methoden/Properties kapseln (Validierung).
- LZ3: Vererbung +
super()für Spezialisierung,__repr__fürs Debugging. - LZ4: dataclasses sind ideal für „Datenobjekte“ wie Teilnehmerprofile.