Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erläuterung der kurzen Anleitung zur Verwendung des Deskriptor-Deskriptors in Python

Ausführliche Erläuterung der kurzen Anleitung zur Verwendung des Deskriptor-Deskriptors in Python

高洛峰
高洛峰Original
2017-03-03 15:53:381410Durchsuche

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!

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