Maison  >  Article  >  développement back-end  >  Que fait le descripteur Python ?

Que fait le descripteur Python ?

(*-*)浩
(*-*)浩original
2019-05-23 09:48:524921parcourir

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.

Que fait le descripteur Python ?

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 :

Que fait le descripteur Python ?

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