Modellierung der realen bzw. gedachten Welt (in abstrakter Form, entsprechend reduziert) als Objekte und Klassen.
Aufgabe:
Seht euch folgendes Video an und notiert Kernkonzepte der Objektorientierung.
https://www.youtube.com/watch?v=ws_KI4Wun4I (Nicht relevant: Sichtbarkeit #protected und ~package)
Die Modellierung ist ein Prozess. Das Ergebnis der Modellierung ist nicht eindeutig. Es kann verschiedene Modelle geben, die für die Implementierung einer Software möglich sind. Als Software-Ingenieur:in muss man sich verschiedene Modellierungsmöglichkeiten mit ihren Vor- und Nachteilen bewusst sein.
| Schritt | Leitfrage | ** Beispiele ** |
|---|---|---|
| Objekte identifizieren | Aus welchen Elemente besteht die Software? | |
| Klassen identifizieren | Objekte mit gleichen Eigenschaften + Verhalten gehören zu einer Klasse | Kunde, Bestellung, Produkt |
| Attribute bestimmen | Welche Eigenschaften oder Daten beschreibt jedes Objekt | Name, Preis, Datum |
| Methoden festlegen | Welche Aktionen oder Funktionen kann die Klasse ausführen | berechnePreis(), speichere(), druckeRechnung() |
| Beziehungen erkennen | Wie hängen die Klassen miteinander zusammen (Assoziation, Vererbung) | Kunde bestellt Produkt |
| Multiplizitäten angeben | Wie viele Objekte der einen Klasse sind mit Objekten der anderen Klasse verbunden | ein Kunde – viele Bestellungen |
Die echte Welt besteht aus Objekten. Diese lassen sich zur Umsetzung von Software modellieren.
Objekte bestehen aus Attributen, Attributwerten und Methoden. Sie stellen meist Gegenstände dar, denen charakteristische Eigenschaften und ein bestimmtes Verhalten zugeordnet wird. Objekte können als Objektkarten dargestellt werden.
Eine beispielhafte Objektkarte für das Objekt mit dem Namen "Peter" der Klasse MENSCH.

Objekte mit gleichen Eigenschaften (Attribute, nicht Attributwerte) können als Klasse zusammengefasst werden.
Eine Klasse ist ein Bauplan für Objekte. Sie definiert Attribute (keine Attributwerte!) und Methoden. Von eine Klasse können beliebig viele Objekte (Instanzen) erzeugt werden.
Klassen und Objekte können in der Sprache UML mit Klassendiagrammen modelliert werden.
Klassen werden mit Klassenkarten modelliert. Beispielhaft für die Klasse Mensch aus dem obigen Beispiel.
| Mensch |
|---|
| + name: str - alter: int + größe: int - gewicht: int + haarfarbe: str + haarlänge: str + augenfarbe: str |
| # Konstruktor / in UML eigentlich Mensch(...) aber in Python init + __init__(name:str, alter:int, größe:int, ...) + get_alter():int + get_gewicht():int + set_gewicht(gewicht:int):None + geburtstag_feiern(): None |
Allgemein:
| Klassenname |
|---|
| sichtbarkeit (+=public, -=private) attributename: datentyp ... ... |
| sichtbarkeit methodenname(parametername:parametertyp, ...):Rückgabetyp ... ... |
In Python exisitiert eine Klasse für alles grundlegenden Datentypen
Private (-) wird in Python durch __ vor dem Attributnamen ausgedrückt. __gewicht ist der Name eines privaten Attributs.
Wie in der echten Welt stehen Objekte miteinander in Beziehung. Dies ist notwendig, damit sie miteinander interagieren/kommunizieren können. Beispiel: Die Klasse Fahrer muss die Klasse Auto kennen um sie steuern zu können.
Es werden folgenden Beziehungen voneinander unterschieden. Für uns ist zukünftig nur Assoziation und Vererbung interessant.

Die Zahlen an den Beziehungen stellen Multiplizitäten an
Beispiel für Multiplizitäten.

Quelle: http://www.uml.ac.at/wp-content/uploads/teaching/02_Klassendiagram_FolienMitText.pdf
Beziehung zwischen einer allgemeineren Klasse (Superklasse) und einer oder mehreren spezialisierteren Klassen (Subklassen).
Die Subklassen erben Attribute und Methoden der Superklasse und können zusätzlich eigene Eigenschaften oder Verhaltensweisen definieren.
Diese Beziehung wird in UML durch eine leere Pfeilspitze (Dreieck) von der Subklasse zur Superklasse dargestellt.
Allemein
![]()
Beispiele
![]()
Die Kapselung (engl. Encapsulation) ist ein grundlegendes Prinzip der objektorientierten Programmierung, das darauf abzielt, die inneren Daten und Implementierungsdetails einer Klasse vor direktem Zugriff von außen zu schützen und nur über klar definierte Schnittstellen verfügbar zu machen.
Ziele
| Schutz von Daten: | verhindert, dass interne Zustände (Attribute) eines Objekts direkt von außen verändert werden |
| Datenintegrität | Änderungen an Attributen können kontrolliert und validiert werden |
| Erhöhte Wartbarkeit und Lesbarkeit | Der Code wird strukturierter, da interne Logik von der äußeren Nutzung getrennt ist. |
| public | keine Unterstriche → z. B. self.name |
| private | zwei Unterstriche __name → Name wird intern umgewandelt |
class Person:
def __init__(self, name, password):
self.name = name # öffentliches Attribut
self._password = password # geschütztes Attribut (Konvention: nur intern verwenden)
def check_password(self, password):
"""Überprüft, ob das eingegebene Passwort korrekt ist."""
return self._password == password
def change_password(self, old_password, new_password):
"""Ändert das Passwort, wenn das alte korrekt ist."""
if self._password == old_password:
self._password = new_password
print("Passwort erfolgreich geändert.")
else:
print("Falsches Passwort – Änderung abgelehnt.")
Polymorphie bedeutet in der objektorientierten Programmierung, dass verschiedene Klassen die gleiche Methode bereitstellen können, aber unterschiedlich implementieren. So kann dieselbe Schnittstelle (z. B. ein Methodenaufruf) auf unterschiedliche Weise funktionieren – abhängig vom Objekttyp.
Der Begriff Polymorphie kommt aus dem Griechischen und bedeutet „Vielgestaltigkeit“ (von poly = „viel“ und morphé = „Gestalt“ oder „Form“).
In der Programmierung beschreibt er also, dass ein und dieselbe Schnittstelle (z. B. ein Methodenname) viele verschiedene Formen annehmen kann – je nachdem, welches Objekt oder welche Klasse sie verwendet.
class Tier:
def sprich(self):
return "Ein Tier macht ein Geräusch."
class Hund(Tier):
def sprich(self):
return "Wuff!"
class Katze(Tier):
def sprich(self):
return "Miau!"
# Polymorphie in Aktion:
tiere = [Hund(), Katze(), Tier()]
for tier in tiere:
print(tier.sprich())