Maison  >  Article  >  développement back-end  >  Introduction détaillée aux descripteurs en Python

Introduction détaillée aux descripteurs en Python

巴扎黑
巴扎黑original
2017-09-16 10:02:151349parcourir

Cet article partagera les connaissances sur les descripteurs en Python. Il est très bon et a une valeur de référence. Les amis qui en ont besoin peuvent s'y référer

Définition

. Habituellement, un descripteur est une propriété d'objet avec un « comportement de liaison ». Le comportement lié peut être remplacé par les méthodes personnalisées __get__() , __set__() et __delete__() via le protocole de descripteur. Si l’une des trois méthodes ci-dessus d’un objet est remplacée, elle peut être appelée un descripteur. Les opérations par défaut pour les propriétés

consistent à obtenir, définir et supprimer une propriété du dictionnaire d'objets. Par exemple, si un. Si un objet dans la chaîne de recherche a une méthode de descripteur définie, Python remplacera le comportement par défaut.

Le descripteur est un outil puissant. Bien que les développeurs n'y entrent pas souvent en contact, il s'agit en fait du mécanisme d'exploitation derrière les classes, les propriétés, les fonctions, les méthodes, les méthodes statiques, les méthodes de classe et super().

Protocole du descripteur

Les trois prototypes de méthode sont les suivants :


descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None

Le descripteur de données est en même temps Un objet avec les méthodes __get__() et __set__(), s'il n'a qu'une méthode __get__(), est un descripteur de non-données. S'il existe une entrée portant le même nom que le descripteur de données dans le dictionnaire d'instance, le descripteur de données a une priorité plus élevée. En revanche, les descripteurs autres que des données ont une faible priorité.

Laissez la méthode __set__() lever une exception pour créer un descripteur de données en lecture seule.

Descripteur d'appel

Le descripteur peut être appelé directement via le nom de la méthode. Par exemple, d.__get__(obj) .

Il est plus courant d'appeler automatiquement le descripteur en accédant aux propriétés de l'objet. Par exemple, si d définit la méthode __get__(), alors obj.d appelle d.__get__(obj).

Pour les objets, b.x sera converti en type(b).__dict__['x'].__get__(b, type(b)) . Et pour les classes (oui, les classes peuvent aussi être appelées), B.x sera converti en B.__dict__['x'].__get__(None, B) .

Exemple de descripteur


class RevealAccess(object):
  """A data descriptor that sets and returns values
    normally and prints a message logging their access.
  """
  def __init__(self, initval=None, name='var'):
    self.val = initval
    self.name = name
  def __get__(self, obj, objtype):
    print('Retrieving', self.name)
    return self.val
  def __set__(self, obj, val):
    print('Updating', self.name)
    self.val = val
>>> class MyClass(object):
...   x = RevealAccess(10, 'var "x"')
...   y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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