Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erläuterung der kurzen Anleitung zur Verwendung des Deskriptor-Deskriptors in Python
Deskriptor wird hauptsächlich zum Definieren von Methoden und Attributen in Python verwendet, und seine Verwendung ist recht technisch. Hier beginnen wir mit den Grundlagen und stellen eine kurze Anleitung für die Verwendung von Deskriptor-Deskriptoren in Python zusammen.
Beim Definieren eines Iterator, die Beschreibung ist ein Objekt, das das Iterationsprotokoll implementiert, dh ein Objekt, das die Methode __iter__ implementiert. Ebenso ist der sogenannte Deskriptor ein Objekt, das das Deskriptorprotokoll implementiert, also die Methoden __get__, __set__ und __delete__.
Allein die Definition ist ziemlich abstrakt. Reden ist billig. Schauen wir uns den Code an:
class WebFramework(object): def __init__(self, name='Flask'): self.name = name def __get__(self, instance, owner): return self.name def __set__(self, instance, value): self.name = value class PythonSite(object): webframework = WebFramework() In [1]: PythonSite.webframework Out[1]: 'Flask' In [2]: PythonSite.webframework = 'Tornado' In [3]: PythonSite.webframework Out[3]: 'Tornado'
definiert eine Klasse WebFramework, die die Deskriptorprotokolle __get__ und __set__ implementiert. Das Objekt (Klasse ist auch ein Objekt. alles ist ein Objekt) wird zum Deskriptor. Die Implementierung von __get__ und __set__ wird als Datendeskriptor bezeichnet. Diejenigen, die nur __get__ implementieren, sind Nicht-Deskriptoren. Der Unterschied zwischen den beiden ist die Priorität des Wörterbuchs relativ zur Instanz.
Wenn im Instanzwörterbuch ein Attribut mit demselben Namen wie der Deskriptor vorhanden ist und der Deskriptor ein Datendeskriptor ist, wird zuerst der Datendeskriptor verwendet. Wenn es sich um einen Nicht-Datendeskriptor handelt, werden die Attribute verwendet im Wörterbuch wird zuerst verwendet.
Deskriptoraufruf
Für diese Art von Magie wird die Aufrufmethode oft nicht direkt verwendet. Dekoratoren müssen beispielsweise mit dem @-Symbol aufgerufen werden. Iteratoren werden normalerweise während der Iteration oder beim nächsten Methodenaufruf verwendet. Der Deskriptor ist relativ einfach und wird aufgerufen, wenn Objektattribute festgelegt werden.
In [15]: webframework = WebFramework() In [16]: webframework.__get__(webframework, WebFramework) Out[16]: 'Flask'
Anwendung des Deskriptors
Die Rolle des Deskriptors liegt hauptsächlich in der Definition von Methoden und Attributen. Da wir die Eigenschaften einer Klasse neu beschreiben können, kann diese Magie einige Verhaltensweisen der Klasse ändern. Die einfachste Anwendung besteht darin, mithilfe eines Dekorators einen Cache mit Klassenattributen zu schreiben. Der Autor von Flask hat eine Werkzeug-Netzwerk-Tool-Bibliothek geschrieben, die die Eigenschaften des Deskriptors verwendet, um einen Cache zu implementieren.
class _Missing(object): def __repr__(self): return 'no value' def __reduce__(self): return '_missing' _missing = _Missing() class cached_property(object): def __init__(self, func, name=None, doc=None): self.__name__ = name or func.__name__ self.__module__ = func.__module__ self.__doc__ = doc or func.__doc__ self.func = func def __get__(self, obj, type=None): if obj is None: return self value = obj.__dict__.get(self.__name__, _missing) if value is _missing: value = self.func(obj) obj.__dict__[self.__name__] = value return value class Foo(object): @cached_property def foo(self): print 'first calculate' result = 'this is result' return result f = Foo() print f.foo # first calculate this is result print f.foo # this is result
Die laufenden Ergebnisse werden nur zwischengespeichert, nachdem sie beim ersten Aufruf berechnet wurden. Dies hat den Vorteil, dass bei der Netzwerkprogrammierung beim Parsen des HTTP-Protokolls der HTTP-Header normalerweise in ein Python-Wörterbuch analysiert wird. Bei Verwendung der Ansichtsfunktion kann jedoch ein für alle Mal auf diesen Header zugegriffen werden Wird als Deskriptor verwendet, kann das redundante Parsen reduziert werden.
Deskriptoren werden in Python häufig verwendet und normalerweise zusammen mit Dekoratoren verwendet. Mit großer Magie geht große Verantwortung einher. Deskriptoren können auch verwendet werden, um eine „Vorkompilierung“ von SQL-Anweisungen in ORM zu implementieren. Die richtige Verwendung von Deskriptoren kann Ihren Python-Code eleganter machen.
Ausführlichere Erläuterungen zur kurzen Verwendungsanleitung für Deskriptor-Deskriptoren in Python finden Sie auf der chinesischen PHP-Website für verwandte Artikel!