Eine Einführung in die Verwendung von Propertys in Python.

In vielen Python-Tutorials werden die Eigenschaften eines Objekts mit so genannten Setter- und Getter-Methoden abgefragt und geändert. Aber ist dies auch pythonic?

Nein, diese Praxis ist gebräuchlich bei anderen Programmiersprachen wie z. B. Java. Technisch funktioniert diese Herangehensweise natürlich auch in Python, allerdings sollte man nie eine der Regel aus der PEP 20 (The Zen of Python) aus den Augen verlieren:

There should be one — and preferably only one — obvious way to do it.

Es gibt also einen eigenen Python-Weg, um Setter und Getter-Methoden einzusetzen? Ja, und zwar einen sehr eleganten! Hierfür wird die Klasse property in Verbindung mit Decorators verwendet. Sehen wir uns doch einmal an, wie Propertys eigesetzt werden können. Dafür brauchen wir zuerst eine Klasse:

# property_example.py
class Speaker:
    def __init__(self):
        self._volume = 10
    
    @property
    def volume(self):
        return self._volume
    
    @volume.setter
    def volume(self, new_volume):
        self._volume = new_volume

Dies ist eine Klasse für einen Lautsprecher, dessen Lautstärke abgerufen und geändert werden kann. In der __init__ Methode wird die private Eigenschaft self._volume definiert. Um den Wert der Eigenschaft abzufragen, wurde hierfür eine Methode mit der Bezeichnung volume erstellt und mit dem Decorator @property versehen. In dieser Methode wird nur die private Eigenschaft mit einer return Anweisung zurückgeben.

Durch den Decorator @property wurde ein Property-Objekt erzeugt, dessen Methoden weitere Möglichkeiten bieten: Um der Eigenschaft self._volume einen neuen Wert zuzuweisen, wurde eine weitere Methode erstellt. Diese hat die gleiche Bezeichnung wie die zuvor erstellte Methode, allerdings wir hier nun volume.setter als Decorator verwendet. In der Methode wird der Eigenschaft über den Parameter new_volume, ein neuer Wert zugewiesen.

Aber wie lässt sich diese Klasse nun verwenden? Werfen wir für diese Frage wieder einen Blick auf etwas Code:

# main.py
import property_example

speaker = property_example.Speaker()

print(speaker.volume)
speaker.volume += 1
print(speaker.volume)

# Ausgabe:
# 10
# 11

Wie wir sehen, darf keine Klammer verwendet werden, da es sich um keinen klassischen Methodenaufruf handelt. Wenn man es trotzdem macht, wird der Python-Interpreter mit einem TypeError antworten. Die Property-Eigenschaft wird daher wie eine gewöhnliche Eigenschaft eines Objekts verwendet. Der große Vorteil ist allerdings: Der Wert wird nicht direkt der Eigenschaft zugewiesen oder von ihr abgerufen, sondern kann noch überprüft und bearbeitet werden. Im Vergleich zu Getter- und Setter-Methoden zeigt sich eine bessere Verwendbarkeit, da eine Wertzuweisung mit einem einfachen Zuweisungsoperator (=) durchführbar ist.

Das Beispiel kann hier interaktiv ausprobiert werden.