Le rôle du descripteur python : proxy les attributs d'une classe, permettant aux programmeurs de personnaliser le travail à effectuer lors du référencement d'un attribut d'objet ; il s'agit de l'implémentation de la structure de données la plus basse dans la plupart des fonctionnalités de la classe Python ; est un composant très important dans les grands frameworks qui utilisent des décorateurs ou des métaclasses.
Cet article présente principalement la définition des descripteurs et quelques compréhensions personnelles. J'espère qu'après avoir lu cet article, vous aurez une compréhension plus claire des descripteurs.
Qu'est-ce qu'un descripteur ?
Définition officielle : Un descripteur est un attribut d'objet avec un "comportement de regroupement". Lors de l'accès (obtention, définition et suppression) de ses propriétés, des méthodes spéciales (_get_(), _set_(), _delete_()) sont en fait appelées. Autrement dit, si un objet définit l’une de ces trois méthodes, il s’agit d’un descripteur.
La fonction du descripteur est de proxy les attributs d'une classe. Il est à noter que le descripteur ne peut pas être défini dans le constructeur de la classe utilisée. Il ne peut être défini que comme un attribut de la classe. Il appartient uniquement à la classe et n'appartient pas à une instance, nous pouvons le confirmer en consultant le dictionnaire des instances et des classes.
Le descripteur est le moyen d'implémenter la structure de données la plus basse dans la plupart des fonctionnalités de la classe Python. Nous utilisons souvent des propriétés telles que @classmethod, @staticmethd, @property et même __slots__. C'est l'un des outils importants de nombreuses bibliothèques et frameworks de haut niveau, et constitue un composant très important dans les grands frameworks qui utilisent des décorateurs ou des métaclasses. Remarque : des concepts tels que les décorateurs et les métaclasses seront expliqués dans les prochains articles.
Ce qui suit est un exemple de descripteur et de code qui fait référence à la classe de descripteur :
class Descriptors: def __init__(self, key, value_type): self.key = key self.value_type = value_type def __get__(self, instance, owner): print("执行Descriptors的get") return instance.__dict__[self.key] def __set__(self, instance, value): print("执行Descriptors的set") if not isinstance(value, self.value_type): raise TypeError("参数%s必须为%s"%(self.key, self.value_type)) instance.__dict__[self.key] = value def __delete__(self, instance): print("执行Descriptors的delete") instance.__dict__.pop(self.key) class Person: name = Descriptors("name", str) age = Descriptors("age", int) def __init__(self, name, age): self.name = name self.age = age person = Person("xiaoming", 15) print(person.__dict__) person.name person.name = "jone" print(person.__dict__)
Parmi eux, la classe Descriptors est un descripteur, et Person est la classe qui utilise le descripteur .
L'attribut __dict__ d'une classe est un attribut intégré de la classe. Les fonctions statiques, les fonctions de classe, les fonctions ordinaires, les variables globales et certains attributs intégrés de la classe sont placés dans la classe __dict__.
Lors de la sortie de la variable descripteur, la méthode __get__ dans le descripteur sera appelée. Lors de la définition de la variable descripteur, la méthode __set__ dans le descripteur sera appelée.
Les résultats de l'exemple ci-dessus sont les suivants :
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!