Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erklärung des Python-Decorator-Property()-Tutorials

Ausführliche Erklärung des Python-Decorator-Property()-Tutorials

巴扎黑
巴扎黑Original
2017-08-18 13:53:001293Durchsuche

1. Was ist ein Dekorateur?

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

2 Funktion Property() Eine kurze Diskussion

2.1 Warum Eigenschaft verwenden?

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.

2.2 Funktionsprototyp:

property(fget=None, fset=None, fdel=None, doc=None)

2.3 Allgemeine Methodendefinition:

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: &#39;Normal&#39; object has no attribute &#39;__count&#39;

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.

Methode 1: Verwenden Sie die Eigenschaftsfunktion property()

class Normal:
    def __init__(self):
        self.__x = None
    def getx(self):
        print(&#39;getx(): self.__x=&#39;, self.__x)
        return self.__x
    def setx(self, value):
        self.__x = value
        print(&#39;setx()&#39;)
    def delx(self):
        print(&#39;delx()&#39;)
        del self.__x
    y = property(getx, setx, delx, "I&#39;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

Methode 2: Verwenden Sie die @ Eigenschaftsdekorator

class Normal:
    
    def __init__(self):
        self.__x = None
    @property
    def xx(self):
        print(&#39;getx(): self.__x=&#39;, self.__x)
        return self.__x
    
    @xx.setter
    def xx(self, value):
        self.__x = value
        print(&#39;setx()&#39;)
    @xx.deleter
    def xx(self):
        print(&#39;delx()&#39;)
        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!

Stellungnahme:
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