UML Klassendiagramm Python: Erstellen & Verstehen für Einsteiger
Lerne, wie du UML-Klassendiagramme für Python-Projekte erstellst und liest. Der praktische Guide für Azubis, Studenten und Berufseinsteiger in der IT.
Von Marcel Schmidtpeter 10. Aug. 2026
Stell dir vor, du startest dein erstes größeres Python-Projekt in der Berufsschule, im Studium oder im neuen Job. Du hast eine Idee im Kopf, aber plötzlich stehst du vor 15 Klassen, die alle miteinander verbunden sind. Genau hier rettet dich ein UML-Klassendiagramm. Es ist wie eine Landkarte für deinen Code - du siehst sofort, welche Klasse was macht und wie sie zusammenhängt. Wer ein UML-Klassendiagramm für Python beherrscht, spart sich Stunden beim Debuggen und plant Architektur wie ein Profi.
Was ist ein UML-Klassendiagramm?
Ein UML-Klassendiagramm (Unified Modeling Language) ist eine standardisierte grafische Darstellung von Klassen und deren Beziehungen in der objektorientierten Programmierung. Es zeigt Attribute (Eigenschaften) und Methoden (Funktionen) einer Klasse in einer Box und visualisiert Verbindungen zu anderen Klassen. Die offizielle UML-Spezifikation der OMG definiert die Regeln für diese Diagramme.
Kernidee: Ein UML-Klassendiagramm ist der Bauplan deines Codes, bevor du auch nur eine Zeile Python schreibst.
Stell dir vor, du baust ein Haus. Du würdest nicht einfach anfangen, Steine aufeinander zu legen. Du brauchst einen Grundriss. Das UML-Klassendiagramm ist genau dieser Grundriss für deine Software - und mit Python setzt du diesen Plan direkt in lauffähigen Code um.
Wie liest du ein UML-Klassendiagramm für Python?
Jedes UML-Klassendiagramm besteht aus rechteckigen Boxen, die in drei Bereiche unterteilt sind: Klassenname (oben), Attribute (Mitte) und Methoden (unten). Die Sichtbarkeit von Attributen und Methoden wird durch Symbole gekennzeichnet - und hier gibt es wichtige Besonderheiten bei Python.
Die Bestandteile einer Klasse im Detail
Jede Klasse im Diagramm folgt diesem Aufbau:
Symbol | Bedeutung in UML | Entsprechung in Python |
`+` | Public (öffentlich) | Normale Attribute/Methoden |
`-` | Private (privat) | `__name` (Name Mangling) |
`#` | Protected (geschützt) | Konvention: `_name` |
Unterstrich | Static (Klassenebene) | `@staticmethod` |
Wichtig: Python hat keinen echten Zugriffschutz wie Java oder C#. Die Unterstriche sind Konventionen, die anderen Entwicklern signalisieren: "Bitte hier nicht direkt zugreifen!" Ein `_` ist eine höfliche Warnung, ein `__` (Double-Underscore) aktiviert Name Mangling und erschwert den direkten Zugriff zusätzlich.
Hier ein Beispiel in UML und Python:
class Auto:
def __init__(self, marke, baujahr):
self._marke = marke
self.__baujahr = baujahr
def starten(self):
print(f"Das Auto {self._marke} startet.")
@staticmethod
def anzahl_raeder():
return 4Das dazugehörige UML-Klassendiagramm sieht so aus:
+------------------------------+
| Auto |
+------------------------------+
| # _marke: String |
| - __baujahr: int |
+------------------------------+
| + starten(): void |
| + anzahl_raeder(): int |
+------------------------------+Welche Beziehungstypen gibt es im UML-Klassendiagramm?
Die wahre Stärke von UML liegt nicht in einzelnen Klassen, sondern in deren Beziehungen zueinander. Diese Verbindungen zeigen, wie Klassen interagieren und voneinander abhängen. Für Python-Projekte sind vor allem drei Typen wichtig.
Vererbung (Inheritance)
Vererbung bedeutet, dass eine Klasse alle Eigenschaften und Methoden einer anderen Klasse erbt. In UML wird sie durch einen Pfeil mit leerer Dreiecksspitze dargestellt, der vom Kind zur Elternklasse zeigt.
class Tier:
def __init__(self, name):
self.name = name
def atmen(self):
print(f"{self.name} atmet.")
class Hund(Tier):
def bellen(self):
print(f"{self.name} bellt!")Faustregel: Nutze Vererbung nur für "IST-EIN"-Beziehungen. Ein Hund IST ein Tier - aber ein Motor IST kein Auto.
Mehr zur Vererbung findest du in unserem Artikel über Python super().
Assoziation und Aggregation
Eine Assoziation ist eine lose "kennt"-Beziehung zwischen zwei Klassen. Eine Aggregation (leere Raute) ist stärker: Sie bedeutet "besteht aus", aber die Teile können auch allein existieren.
Beispiel: Ein Auto hat Räder, aber die Räder können auch ohne das Auto weiterexistieren.
class Rad:
def __init__(self, groesse):
self.groesse = groesse
class Auto:
def __init__(self):
self.raeder = [Rad(17), Rad(17), Rad(17), Rad(17)]Komposition
Eine Komposition (ausgefüllte Raute) ist die stärkste Form der Beziehung. Wenn das Hauptobjekt zerstört wird, werden auch die Teilobjekte gelöscht. Ohne das Ganze gibt es die Teile nicht.
Stell dir ein Haus und seine Zimmer vor. Ohne das Haus gibt es keine Zimmer.
class Zimmer:
def __init__(self, name):
self.name = name
class Haus:
def __init__(self):
self.zimmer = [Zimmer("Wohnzimmer"), Zimmer("Schlafzimmer")]Beziehung | Symbol | Bedeutung | Beispiel |
Vererbung | Pfeil mit Dreieck | "ist ein" | Hund → Tier |
Assoziation | Einfache Linie | "kennt" | Lehrer - Schueler |
Aggregation | Leere Raute | "hat" (Teil unabhängig) | Auto ◇ - Rad |
Komposition | Gefüllte Raute | "besteht aus" (Teil abhängig) | Haus ♦ - Zimmer |
Wie setzt du ein UML-Klassendiagramm in Python-Code um?
Jetzt schauen wir uns ein vollständiges Beispiel an, das alle Konzepte vereint. Wir bauen ein kleines Bibliothekssystem mit Vererbung und Komposition. Das Python-Tutorial zu Klassen der offiziellen Python-Doku liefert dir die nötigen Grundlagen dazu.
Das UML-Diagramm sieht vereinfacht so aus:
Buch "1" o-- "0..*" Exemplar : hat
Roman --|> Buch : erbtSo setzt du es in Python um:
class Buch:
def __init__(self, titel, autor):
self.titel = titel
self.autor = autor
self.exemplare = []
def exemplar_hinzufuegen(self, exemplar):
self.exemplare.append(exemplar)
class Exemplar:
def __init__(self, inventarnummer, zustand="neu"):
self.inventarnummer = inventarnummer
self.zustand = zustand
class Roman(Buch):
def __init__(self, titel, autor, genre):
super().__init__(titel, autor)
self.genre = genre
# Nutzung
mein_roman = Roman("1984", "George Orwell", "Dystopie")
ex1 = Exemplar("INV-001")
mein_roman.exemplar_hinzufuegen(ex1)
print(f"Buch: {mein_roman.titel} von {mein_roman.autor}")
print(f"Exemplare: {len(mein_roman.exemplare)}")Warum ist dieser Code sauber? Weil jede Klasse eine klare, einzige Verantwortung hat. Das nennt man das Single Responsibility Principle (SRP). Ein Klassendiagramm zwingt dich, diese Struktur VOR dem Coden zu durchdenken - und genau das unterscheidet Hobby-Code von professioneller Software.
Wie erstellst du ein UML-Klassendiagramm?
Du kannst UML-Diagramme von Hand zeichnen oder Tools nutzen. Für Einsteiger empfehle ich PlantUML, weil es textbasiert funktioniert und direkt in vielen IDEs läuft.
So sieht PlantUML für unser Bibliotheksbeispiel aus:
@startuml
class Buch {
+ titel: String
+ autor: String
+ exemplare: List
+ exemplar_hinzufuegen(exemplar): void
}
class Exemplar {
+ inventarnummer: String
+ zustand: String
}
class Roman {
+ genre: String
}
Buch "1" -- "0..*" Exemplar : hat >
Roman --|> Buch
@endumlTipp: Alternativen zu PlantUML sind draw.io für grafisches Ziehen mit der Maus oder Mermaid, das direkt in GitHub- und GitLab-READMEs gerendert wird.
Welche Fehler machen Anfänger bei UML-Klassendiagrammen?
Drei Fehler sehen ich immer wieder - bei Azubis, Studenten und Berufseinsteigern.
Fehler 1: Zu viele Details abbilden
Ein Klassendiagramm soll die Architektur zeigen, nicht jeden Getter und Setter. Wenn du 50 Methoden in einer Box stehen hast, verlierst du den Überblick - und niemand liest das Diagramm freiwillig.
Richtig: Nur die wichtigsten öffentlichen Methoden und Schlüsselattribute eintragen. Getter und Setter kann man sich denken.
Fehler 2: Beziehungstypen verwechseln
Anfänger nutzen oft überall Vererbung, wenn eigentlich eine Aggregation gemeint ist. Das führt zu unnötig komplexen Klassenhierarchien, die schwer zu warten sind.
Falsch: `class Motor(Auto)` - ein Motor IST kein Auto.
Richtig: Aggregation - ein Auto HAT einen Motor.
# Falsch: Motor erbt von Auto
class Motor(Auto):
pass
# Richtig: Auto hat einen Motor (Aggregation)
class Motor:
def __init__(self, leistung):
self.leistung = leistung
class Auto:
def __init__(self, motor):
self.motor = motorFehler 3: UML als Zwang sehen
UML ist ein Werkzeug, kein Gesetz. Wenn du im Laufe des Projekts merkst, dass deine Struktur nicht optimal ist, passe das Diagramm an.
Merke: Das Diagramm dient dem Code, nicht umgekehrt. Aktualisiere es, wenn sich deine Architektur entwickelt - nicht nur einmal am Anfang.
Wie kannst du UML-Klassendiagramme üben?
Nimm ein Projekt aus deinem Alltag: eine Pizza-Bestell-App, eine ToDo-Liste oder ein Bibliothekssystem. Zeichne zuerst das Diagramm auf Papier, dann code es in Python. So trainierst du das Denken in Strukturen.
Profi-Tipp: Das Zeichnen mit Stift und Papier prägt dir die Konzepte besser ein, als direkt ein Tool zu nutzen. Erst wenn der Entwurf steht, überträgst du ihn in PlantUML oder Mermaid.
FAQ: Häufige Fragen zu UML-Klassendiagrammen und Python
Kann Python UML direkt generieren?
Ja, mit Pyreverse (Teil von Pylint) erstellst du aus vorhandenem Python-Code automatisch UML-Diagramme. Der Aufruf lautet `pyreverse -o png mein_modul.py`. Das ist praktisch, wenn du fremden Code verstehen musst.
Brauche ich als Python-Entwickler wirklich UML?
In kleinen Projekten (unter 5 Klassen) reicht oft ein Whiteboard. In professionellen Teams, im Studium oder bei Abschlussarbeiten wird UML aber erwartet. Es hilft dir, deine Gedanken zu strukturieren und komplexe Zusammenhänge verständlich zu erklären.
Was bedeutet die Zahl an den Verbindungslinien?
Das ist die Multiplizität. Sie gibt an, wie viele Objekte miteinander verbunden sein können.
Angabe | Bedeutung |
`1` | Genau ein Objekt |
`0..1` | Null oder ein Objekt |
`*` | Beliebig viele |
`0..*` | Null bis beliebig viele |
`1..*` | Mindestens eins |
Beispiel: Ein Buch (1) hat mehrere Exemplare (0..*).
Ist UML nur für Python?
Nein, UML ist sprachunabhängig. Du kannst dasselbe Diagramm in Python, Java oder C# umsetzen. Die Konzepte der Objektorientierung sind universell - nur die Syntax unterscheidet sich.
Gibt es Alternativen zu UML-Klassendiagrammen?
Für dynamische Abläufe gibt es andere UML-Diagrammtypen wie Sequenzdiagramme (wer ruft wann wen?) oder Aktivitätsdiagramme (welcher Prozess läuft ab?). CRC-Karten (Class-Responsibility-Collaboration) sind eine leichtgewichtige Alternative für den Anfang.
Fazit
Ein UML-Klassendiagramm für Python ist nicht nur ein akademisches Werkzeug, das du in der Prüfung brauchst. Es ist dein bester Freund, wenn du komplexe Projekte planen und kommunizieren willst. Egal ob in der Ausbildung, im Studium oder im ersten Job - die Fähigkeit, Code-Architektur zu strukturieren, unterscheidet Anfänger von Profis.
Starte einfach: Nimm dein nächstes Projekt, zeichne ein Diagramm auf Papier und code es danach in Python. Du wirst überrascht sein, wie viel klarer deine Architektur wird.
Brauchst du Hilfe bei Python-Projekten, OOP-Konzepten oder der Vorbereitung auf deine IHK-Prüfung? Bei study-it.education findest du erfahrene Nachhilfelehrer, die dich genau da abholen, wo du stehst. Schau vorbei und buche deine erste Session!
1:1-Hilfe zu diesem Thema?
Brauchst du jemand, der das mit dir durchgeht?
Statt nochmal lesen: 30 min mit einem Senior-Dev.
Kostenloses Erstgespräch buchen →
Lerne, wie du UML-Klassendiagramme für Python-Projekte erstellst und liest. Der praktische Guide für Azubis, Studenten und Berufseinsteiger in der IT.
marcel.schmidtpeter@study-it.education →Mehr Lesestoff
Python None Optional: None-Werte sicher behandeln – einfach erklärt
None-Werte sicher behandeln: Erfahre, wie Optional und Typannotationen in Python funktionieren und wie du typische None-Fehler vermeidest.
Python List Comprehension map filter: Einfach erklärt mit Beispielen
List Comprehensions, map und filter im Vergleich: So filterst und transformierst du Daten in Python – mit anschaulichen Beispielen für den Einstieg.
Python Typannotationen und Generics einfach erklärt
Typannotationen und Generics in Python erklärt: So nutzt du Type Hints für lesbaren, wartbaren Code – mit Beispielen für Einsteiger.