Offizielle Definition: Decorator ist ein bekanntes Entwurfsmuster, das häufig in Szenarien mit übergreifenden Anforderungen verwendet wird. Zu den klassischeren gehören das Einfügen von Protokollen, Leistungstests, Transaktionsverarbeitung usw. Dekoratoren sind ein hervorragendes Design zur Lösung dieser Art von Problemen. Mit Dekoratoren können wir den gleichen Code in einer großen Anzahl von Funktionen extrahieren, der nichts mit der Funktion selbst zu tun hat, und ihn weiterhin wiederverwenden. Kurz gesagt besteht der Zweck eines Dekorateurs darin, einem vorhandenen Objekt zusätzliche Funktionalität hinzuzufügen.
Python enthält insgesamt drei integrierte Dekoratoren:
① staticmethod
② classmethod
③ property
Wenn wir auf Attribute zugreifen und Attributen Werte zuweisen, beschäftigen wir uns normalerweise mit Klassen und Instanzen __dict__; wenn wir den Attributzugriff standardisieren möchten, stehen uns jedoch zwei Möglichkeiten zur Verfügung: ① Datendeskriptor, ② () Eigenschaftsfunktion.
Wir wissen jedoch, dass Deskriptoren relativ komplex und für Anfänger schwer zu verwenden sind. Daher können Sie es auch mit property() versuchen. Im Vergleich zum großen Prozess von Deskriptoren entspricht Property einem Thread.
property(fget=None, fset=None, fdel=None, doc=None)
Angenommen, es gibt eine private Variable __x in calss Normal, wie im folgenden Code gezeigt:
#code 1 class Normal: def __init__(self): self.__x = None def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x tN = Normal() print(tN.__count)
Ausgabeergebnis (ein Fehler wird gemeldet)
Traceback (most recent call last): File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module> print(tN.__count) AttributeError: 'Normal' object has no attribute '__count'
Warum wird ein Fehler gemeldet? ? Da das Attribut __x der Instanz tN ein privates Attribut ist und nicht direkt aufgerufen werden kann, können wir nur die intern definierte Methode aufrufen
tN = Normal() tN.setx(10) print(tN.getx())
Ausgabeergebnis:
6 10
Verwenden Sie das interne Mit dieser Methode können Sie problemlos den privaten Attributwert einer Instanz oder Klasse abrufen.
Wenn ich jedoch den setx-Methodennamen der Klasse „Normal“ in etwas anderes ändern möchte (z. B. „Normal_setx“), wird diese Funktion verwendet Muss ich den Aufrufort der Methode einzeln finden und dann einzeln ändern?
Die C-Sprache kann das vielleicht, aber Python, eine Hochsprache, wie kann sie ein solches Problem nicht lösen?
Wie können also die oben genannten Probleme gelöst werden?
Es gibt eigentlich zwei Methoden.
class Normal: def __init__(self): self.__x = None def getx(self): print('getx(): self.__x=', self.__x) return self.__x def setx(self, value): self.__x = value print('setx()') def delx(self): print('delx()') del self.__x y = property(getx, setx, delx, "I'm a property") tN=Normal() tN.y=10 tN.y del tN.y #输出结果: setx() getx(): self.__x= 10 delx()
Die Methode wird direkt als Eigenschaft betrieben, was sehr praktisch ist
class Normal: def __init__(self): self.__x = None @property def xx(self): print('getx(): self.__x=', self.__x) return self.__x @xx.setter def xx(self, value): self.__x = value print('setx()') @xx.deleter def xx(self): print('delx()') del self.__x tN=Normal() tN.xx=10 tN.xx del tN.xx #输出结果信息: setx() getx(): self.__x= 10 delx()
Die Ausgabe ist die gleiche wie bei Methode 1, was beweist, dass beide Methoden machbar sind (Hinweis: Die erste muss @property sein (ersetzt Getter, sonst wird ein Fehler gemeldet)).
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung des Python-Decorator-Property()-Tutorials. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!