Property Decorator in Python
Wir können unsere Klassen erstellen und verschiedene Datenelemente und Funktionen in Python definieren. Alles ist ein Objekt, und wir können Objekte unserer eigenen definierten Klasse instanziieren.
In diesem Tutorial wird die Verwendung des Python-Eigenschaften-Decorators (@property
) demonstriert.
Eigenschaften in Python
Manchmal verwenden wir die Getter- und Setter-Funktionen von Python, um ein nicht öffentliches Klassenattribut zurückzugeben.
Wir erstellen innerhalb der Klasse eine Funktion, die dieses Attribut zurückgibt, die getter
-Funktion.
Die Funktion, die den Wert für ein solches Attribut setzen kann, wird als setter
-Funktion bezeichnet.
Beispiel:
class A:
def __init__(self, a):
self._a = a
def getter_a(self):
return self._a
def setter_a(self, val):
self._a = val
n = A(5)
print(n.getter_a())
n.setter_a(10)
print(n.getter_a())
Ausgabe:
5
10
Im obigen Beispiel haben wir die Getter- und Setter-Funktionen erstellt, die den Attributwert von a
zurückgeben und ändern.
Diese Methode wird nicht als die pythonische Art betrachtet, mit Attributen umzugehen. Wir können die Notwendigkeit beseitigen, die Klasse mit Getter- und Setter-Methoden zu clustern.
Der Python-Ansatz beinhaltet die Verwendung von Eigenschaften, die Funktionalitäten für ein bestimmtes Klassenattribut einrichten können.
Mit der Funktion property()
erzeugen wir Objekte der Klasse property
. Wir hängen die Getter-, Setter- und Deleter-Methoden als Eigenschaften für ein Datenelement an.
Dazu verwenden wir die Argumente fget
, fset
, fdel
und doc
innerhalb der Eigenschaftsfunktion.
Die mit fget
verknüpfte Funktion gibt den Wert des Attributs zurück. Ebenso ändert die Methode fset
den Wert des Attributs, und die Funktion fdel
löscht den Wert.
Die Methode doc
liefert die Dokumentation für ein gegebenes Attribut.
Wir werden diese im folgenden Code verwenden.
class A:
def __init__(self, a):
self._a = a
def get_a(self):
return self._a
def set_a(self, val):
self._a = val
def del_a(self):
del self._a
print("Deleted")
a = property(fget=get_a, fset=set_a, fdel=del_a, doc="Documenttion for a")
n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)
Ausgabe:
5
10
Deleted
Traceback (most recent call last):
File "<string>", line 21, in <module>
File "<string>", line 6, in get_a
AttributeError: 'A' object has no attribute '_a'
Im obigen Beispiel haben wir die Eigenschaft a
für die Klasse erstellt und die erforderlichen Eigenschaften hinzugefügt. Wie Sie sehen können, erhalten wir nach Verwendung der Eigenschaft deleted
den AttributeError
, der anzeigt, dass das Attribut entfernt wurde.
Verwendung von den Decorator @property
in Python
Decorators werden in Python verwendet, um einer Funktion zusätzliche Funktionalität hinzuzufügen. Eine Funktion wird als Argument genommen und eine andere Funktion zurückgegeben.
Nach der Einführung von Dekoratoren in Python wurde die Verwendung der Funktion property()
zum Festlegen der Eigenschaften abgeschwächt, und die Dekorator-Syntax dafür wurde bevorzugt.
Die Decorators wurden in Python v2.4 eingeführt. Der Decorator @property
wurde beliebt, um Eigenschaften zu erstellen.
Wir werden den Decorator @property
im vorherigen Beispiel unten verwenden.
class A:
def __init__(self, a):
self._a = a
@property
def a(self):
return self._a
@a.setter
def a(self, val):
self._a = val
@a.deleter
def a(self):
del self._a
print("Deleted")
n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)
Ausgabe:
5
10
Deleted
Traceback (most recent call last):
File "<string>", line 23, in <module>
File "<string>", line 7, in a
AttributeError: 'A' object has no attribute '_a'
Wie Sie sehen können, haben wir die gleiche Ausgabe wie im vorherigen Beispiel erhalten. Diese Methode ist relativ einfach zu verwenden als die Funktion property()
.
Beim Decorator @property
verwenden wir die Funktion, die das Attribut als Property-Name zurückgibt. Danach fügen @<property-name>.setter
und @<property-name>.deleter
die Setter- und Deleter-Methoden hinzu.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn