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!