Die Properties (property) in Python wurden als eleganter Weg eingeführt, um die Kapselung von Attributen zu implementieren, ähnlich wie Getter und Setter in anderen Sprachen (Java/C++), jedoch ohne die Notwendigkeit, Methoden explizit aufzurufen. Vor der Einführung von property musste der Zugriff auf Variablen über explizite Getter/Setter-Methoden realisiert werden, was die Klasse komplizierter machte und ihr Interface unübersichtlich gestaltete.
Das Problem besteht darin, dass Benutzer der Klasse einen transparenten Zugriff auf die Attribute haben sollten (mittels Punktnotation obj.x), während im Hintergrund die Logik der Berechnung, Prüfung, Cache oder Validierung der Werte gesteuert werden kann. Ohne property müsste bei einer Änderung der internen Implementierung auch jeder Aufruf angepasst werden, was zu massiven Fehlern und reduziertem Erweiterungspotenzial führen würde.
Die Lösung — der Dekorator @property ermöglicht es, eine Methode in ein Attribut umzuwandeln und gleichzeitig die Logik der Berechnung, Prüfung oder lazy loading innerhalb der Methoden zu verbergen, ohne das externe Interface der Klasse zu ändern. Der Getter ist nur lesbar, mit .setter wird das Schreiben organisiert und .deleter — das Löschen.
Beispielcode:
class Rectangle: def __init__(self, width, height): self._width = width self._height = height @property def area(self): # 'area' kann jetzt als Attribut gelesen werden return self._width * self._height @property def width(self): return self._width @width.setter def width(self, value): # wird automatisch aufgerufen, wenn rect.width = ... zugewiesen wird assert value > 0, "Width must be positive" self._width = value rect = Rectangle(3, 4) print(rect.area) # 12 rect.width = 10 print(rect.area) # 40
Schlüsselfunktionen:
Kann property mit Klassenmethoden oder statischen Methoden arbeiten?
Nein. property macht nur instanzbasierte (exemplarische) Eigenschaften. Für klassenbasierte Eigenschaften verwenden Sie spezielle Deskriptoren oder @classmethod-property (manuell implementiert).
Wenn man eine property nur mit Getter ohne Setter deklariert, kann man dann in das Attribut schreiben?
Nein. Dieses property ist schreibgeschützt; ein Zuweisungsversuch löst einen AttributeError aus.
Was passiert, wenn im Setter eine Ausnahme auftritt (zum Beispiel, assert)?
Die Ausnahme wird nach außen weitergegeben, die Zuweisung erfolgt nicht, und der Wert des Attributs bleibt unverändert. Dies wird häufig zur Validierung verwendet.
Negativer Fall: Öffentliche Klassenattribute, deren Änderung ohne Kontrolle erfolgt.
Vorteile: schnell, einfach.
Nachteile: Man kann die interne Logik nicht ändern, ohne den Kunden-Code neu zu schreiben, mögliche inkonsistente Zustände.
Positiver Fall: Kapselung durch property, Logik in Getter/Setter, strenge Prüfungen.
Vorteile: Flexibilität, Kontrolle, Transparenz, sichere Evolution der API.
Nachteile: etwas mehr Code, geringfügige Komplikationen beim Debuggen.