@property
-Dekorator#
In Python könnt ihr direkt auf Instanzvariablen zugreifen, ohne zusätzliche Getter- und Setter-Methoden, die häufig in Java und anderen objektorientierten Sprachen verwendet werden. Dies macht das Schreiben von Python-Klassen sauberer und einfacher, aber in manchen Situationen kann die Verwendung von Getter- und Setter-Methoden auch nützlich sein. Nehmen wir an, dass ihr einen Wert benötigt, bevor ihr ihn in eine Instanzvariable setzt, oder ihr einfach den Wert eines Attributs herausfinden möchtet. In beiden Fällen würden Getter- und Setter-Methoden die Aufgabe erfüllen, allerdings um den Preis, dass der einfache Zugriff auf Instanzvariablen in Python verloren ginge.
Die Antwort ist die Verwendung einer Property. Diese kombiniert die
Möglichkeit, den Zugriff auf eine Instanzvariable über Methoden wie Getter und
Setter zu übergeben, mit dem einfachen Zugriff auf Instanzvariablen über die
Punktnotation. Um eine Property zu erstellen, wird der
property
-Dekorator mit einer Methode verwendet, die den Namen
der Eigenschaft hat:
23 @property
24 def length(self):
25 return self.__length
Ohne Setter ist die Property length
jedoch schreibgeschützt:
>>> s1 = form.Square()
>>> s1.length = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
Um dies zu ändern, müsst ihr einen Setter hinzufügen:
27 @length.setter
28 def length(self, new_length):
29 self.__length = new_length
Jetzt könnt ihr die Punkt-Notation verwenden, um die Eigenschaft length
sowohl zu erhalten als auch zu setzen. Beachtet, dass der Name der Methode
derselbe bleibt, aber der Dekorator ändert sich in den Property-Namen, in
unserem Fall in length.setter
:
>>> s1 = form.Square()
>>> s1.length = 2
>>> s1.circumference()
8
Ein großer Vorteil von Pythons Fähigkeit, Eigenschaften hinzuzufügen, besteht darin, dass ihr zu Beginn der Entwicklung mit einfachen alten Instanzvariablen arbeiten und dann nahtlos zu Property-Variablen wechseln könnt, wann immer und wo immer ihr dies benötigt, ohne den Client-Code zu ändern. Der Zugriff ist immer noch derselbe, unter Verwendung der Punktnotation.