property

In der Objekt-orientierten Programmierung (OOP) hat man es mit Objekten zutun, die Attribute und Methoden besitzen und von einer Klasse abstammen. Mit dieser Modellvorstellung lassen sich alltägliche Probleme schön und anschaulich lösen, da auch hier meistens verschiedene Objekte mit verschiedenen Eigenschaften (Attributen) und Fähigkeiten (Methoden) vorkommen.

Schwierig wird es bei dieser Vorstellung nur immer dann, wenn eine Eigenschaft als solche nicht als Attribut gespeichert werden kann (oder soll), meist, weil dadurch die selbe Information mehrfach an verschiedenen Stellen gespeichert würde. Soetwas vermeiden Programmierer sehr gerne, um Syncronisierungsproblemen vorzubeugen.

Nimmt man beispielsweise ein Objekt der Klasse "Kasse", so besitzt dieses verschiedene Eigenschaften (z.B. die Zahl der ein und zwei Euro Stücke) und Methoden (z.B. etwas wird aus der Kasse genommen oder in die Kasse gelegt). Der Gesamtwert des Geldes in der Kasse wäre eine weitere Eigenschaft, würde man hier aber einen numerischen Wert speichern, müsste dieser bei jeder Änderung der Geldstücke ebenfalls neu berechnet und verändert werden. Meist verwendet man deshalb eine Methode statt einer Eigenschaft, die diesen Wert berechnet. Letzteres ist aber nicht naheliegend und stört deshalb die Modellvorstellung.

An dieser Stelle hilft einem das Python-Konstrukt "property". Mit diesem kann man eine Eigenschaft erzeugen, die sich auch als solche verwenden lässt, bei jedem Zugriff diesen aber transparent an eine Funktion weitergibt.

Der Sachverhalt lässt sich am besten an einer konkreten Implementation beschreiben:

class Kasse:
    ein_euro = 0
    zwei_euro = 0
    def _get_gesamtsumme(self):
        return self.ein_euro + self.zwei_euro * 2
    gesamtsumme = property(_get_gesamtsumme)

Erzeugt man nun von dieser Klasse ein Objekt, so hat es unter anderem ein Attribut "gesamtsumme", das immer die korrekte Gesamtsumme ausgibt, ohne, dass diese explizit berechnet werden muss.

kasse = Kasse()
kasse.ein_euro = 10
kasse.zwei_euro = 10
print kasse.gesamtsumme

In meinem Beispiel habe ich nur eine Funktion an "property" übergeben, sodass nur das Auslesen des Wertes einwandfrei funktioniert. Möchte ich die Eigenschaft mit einem neuen Wert überschreiben (was in diesem Beispiel nicht sinnvoll ist), benötigt man eine weitere Funktion, ebenso, wenn man auch das Löschen des Attributes erlauben möchte. Weitere Auskunft dazu bekommt man in jeder interaktiven Python-Shell mit dem Befehl "help(property)".

Tags: Python