Heim > Backend-Entwicklung > Python-Tutorial > Wie funktioniert der @property Decorator von Python zum Erstellen von Eigenschaften?

Wie funktioniert der @property Decorator von Python zum Erstellen von Eigenschaften?

Patricia Arquette
Freigeben: 2024-12-19 01:12:11
Original
583 Leute haben es durchsucht

How Does Python's @property Decorator Work to Create Properties?

Den @property Decorator in Python verstehen

In Python können Sie mit dem @property Decorator Eigenschaften erstellen, die sich wie reguläre Instanzattribute verhalten. Im Gegensatz zu integrierten Eigenschaftsfunktionen, die Argumente entgegennehmen, empfängt der @property-Dekorator jedoch keine expliziten Argumente.

Wie es funktioniert

Um zu verstehen, wie die @property Damit der Decorator funktioniert, ist es wichtig, zunächst zu verstehen, dass die Funktion property() ein Deskriptorobjekt zurückgibt. Dies ist ein Vermittler, der zwischen einer Instanz und ihrer Eigenschaft sitzt und die Anwendung zusätzlicher Logik ermöglicht.

Das Deskriptorobjekt

Das von der Eigenschaft zurückgegebene Deskriptorobjekt( )-Funktion verfügt über drei integrierte Methoden:

  • Getter: Zum Abrufen der Eigenschaft value
  • Setter: Zum Festlegen des Eigenschaftswerts
  • deleter: Zum Löschen der Eigenschaft

Erstellen von Eigenschaften mit dem Decorator

Wenn der @property Decorator auf a angewendet wird Funktion gibt sie ein Deskriptorobjekt zurück und weist es dem Eigenschaftsnamen zu. Dieses Objekt behält die Getter-Funktion der ursprünglichen Funktion bei und enthält zwei zusätzliche Funktionen, die an die Setter- und Löschmethoden der Eigenschaft delegieren.

Zum Beispiel:

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x
Nach dem Login kopieren

Der obige Code erstellt eine Eigenschaft mit dem Namen „x“, die den Wert von self._x ohne explizites Eigenschaftsobjekt abrufen kann. Die Getter-Funktion wird automatisch vom Dekorateur erstellt.

Setter- und Deleter-Dekoratoren

Um Setter- und Löschmethoden hinzuzufügen, hängen Sie einfach .setter und .deleter an die @-Eigenschaft an Deskriptorobjekt, das Ihre beabsichtigten Funktionen übergibt:

@x.setter
def x(self, value):
    self._x = value

@x.deleter
def x(self):
    del self._x
Nach dem Login kopieren

Mit diesen Methoden können Sie benutzerdefiniertes Verhalten für die Einstellung und implementieren Löschen des Eigenschaftswerts.

Implementierungsdetails

Die @decorator-Syntax für @property ist syntaktischer Zucker. Hinter den Kulissen wird der folgende Code ausgeführt:

def x(self): return self._x
x = property(x)
Nach dem Login kopieren

Deskriptor-Beispiel

Hier ist ein Beispiel dafür, wie eine reine Python-Implementierung eines Eigenschaftsdeskriptors funktionieren würde:

class Property:
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(obj)
Nach dem Login kopieren

Mit dieser Klasse können Sie Eigenschaften mit Getter-, Setter- und Löschfunktionen manuell erstellen.

Das obige ist der detaillierte Inhalt vonWie funktioniert der @property Decorator von Python zum Erstellen von Eigenschaften?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage