Explication détaillée du guide concis d'utilisation du descripteur descripteur en Python

高洛峰
Libérer: 2017-03-03 15:53:38
original
1387 Les gens l'ont consulté

Le descripteur est principalement utilisé pour définir des méthodes et des attributs en Python, et son utilisation est assez technique. Ici, nous allons partir des bases et compiler un guide concis pour utiliser les descripteurs de descripteur en Python

Quand Lors de la définition d'un descripteur. itérateur, la description est un objet qui implémente le protocole d'itération, c'est-à-dire un objet qui implémente la méthode __iter__. De la même manière, le soi-disant descripteur est un objet qui implémente le protocole de descripteur, c'est-à-dire les méthodes __get__, __set__ et __delete__.

En regardant la définition seule, c'est assez abstrait. parler ne coûte rien. Regardons le code :

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'
Copier après la connexion

définit une classe WebFramework, qui implémente les protocoles de descripteurs __get__ et __set__. L'objet (classe est aussi un objet , tout est objet) devient un descripteur. L'implémentation de __get__ et __set__ est appelée un descripteur de données. Ceux qui implémentent uniquement __get__ ne sont pas des descripteurs. La différence entre les deux réside dans la priorité du dictionnaire par rapport à l'instance.

S'il existe un attribut du même nom que le descripteur dans le dictionnaire d'instance, si le descripteur est un descripteur de données, le descripteur de données sera utilisé en premier. S'il s'agit d'un descripteur de non-données, les attributs. dans le dictionnaire sera utilisé en premier.

Appel de descripteur
Pour ce type de magie, la méthode d'appel n'est souvent pas utilisée directement. Par exemple, les décorateurs doivent être appelés avec le symbole @. Les itérateurs sont généralement utilisés lors de l'itération ou lors de l'appel de méthode suivant. Le descripteur est relativement simple et sera appelé lorsque les attributs de l'objet seront définis.

In [15]: webframework = WebFramework()

In [16]: webframework.__get__(webframework, WebFramework)
Out[16]: 'Flask'
Copier après la connexion

Application du descripteur
Le rôle du descripteur est principalement dans la définition des méthodes et des attributs. Puisque nous pouvons re-décrire les propriétés d’une classe, cette magie peut modifier certains comportements de la classe. L'application la plus simple consiste à utiliser un décorateur pour écrire un cache d'attributs de classe. L'auteur de Flask a écrit une bibliothèque d'outils réseau efficace, qui utilise les caractéristiques du descripteur pour implémenter un cache.

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
Copier après la connexion

Les résultats en cours d'exécution sont visibles. First Calcul ne met en cache les résultats qu'après leur calcul lors du premier appel. L'avantage de ceci est que dans la programmation réseau, lors de l'analyse du protocole HTTP, l'en-tête HTTP est généralement analysé dans un dictionnaire de python. Lors de l'utilisation de la fonction d'affichage, cet en-tête est accessible sans le savoir, cet en-tête est donc utilisé comme descripteur. La mise en cache peut réduire l'analyse redondante.

Les descripteurs sont largement utilisés en python, généralement utilisés avec les décorateurs. Une grande magie implique de grandes responsabilités. Les descripteurs peuvent également être utilisés pour implémenter la « précompilation » d'instructions SQL dans ORM. Une bonne utilisation des descripteurs peut rendre votre code Python plus élégant.

Pour des explications plus détaillées du bref guide d'utilisation des descripteurs de descripteurs en Python, veuillez faire attention au site Web PHP chinois pour les articles connexes !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal