Maison > développement back-end > Tutoriel Python > Introduction détaillée aux descripteurs d'attributs en python (exemple de code)

Introduction détaillée aux descripteurs d'attributs en python (exemple de code)

不言
Libérer: 2018-12-12 10:37:11
avant
2836 Les gens l'ont consulté

Cet article vous apporte une introduction détaillée (exemple de code) sur les descripteurs d'attributs en python. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

En tant que novice, je lis constamment des choses et j'apprends des connaissances chaque jour. Aujourd'hui, je vais vous présenter une bonne chose - Descripteur d'attribut

Qu'est-ce qu'un descripteur d'attribut ?

En fait, toute fonction magique parmi

set__, __get__, __delete implémentée dans une classe est un descripteur d'attribut.

Ensuite, nous définissons un descripteur d'attribut :

class IntegerField:
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        pass
    def __delete__(self, instance):
        pass
class User:
    high= IntField()
Copier après la connexion
__get__ : Lorsque nous appelons cet attribut avec une classe ou une instance, le résultat de la fonction __get__ sera renvoyé.

__set__ : Python appellera cette fonction lorsque nous utiliserons
instance pour définir la valeur de l'attribut. Il n'y a aucune restriction sur les cours. __delete__ : Python appellera cette fonction lorsque nous essaierons de supprimer l'attribut à l'aide d'une instance. Il n'y a aucune restriction sur les cours.
Comment utiliser cette chose ? Ensuite, je modifierai le code ci-dessus pour tout le monde

class IntegerField:
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        if not isinstance(value,numbers.Integral):
            raise ValueError("请输入一个整数")
        self.value=value
        
    def __delete__(self, instance):
        pass
class User:
    high=IntegerField() 
#验证代码
if __name__ == '__main__':
    user=User()
    user.high='175'    #报错,ValueError:请输入一个整数
    User.high=175    #正确执行,不报错
Copier après la connexion
afin que nous puissions utiliser des descripteurs d'attributs pour attacher une certaine logique aux attributs.

En fait, sous le descripteur d'attribut, il est également divisé en
1 Descripteur de données : implémente __set__, __get__

if __name__ == '__main__':
    user=User()
    user.high=175
    print(user.__dict__)    #high是不放入__dict__中的,优先查找数据描述符中的值
    user.__dict__["high"]="abc"    #这样赋值时可以的,并且可以放入__dict__中
    print(user.high)    #会报错,因为在调用__get__方法时并没有value属性
Copier après la connexion
2 Non-données : implémente __get__ mais n'implémente pas __set__.

class NonField:
    def __init__(self, high=170):
        self.value = high

    def __get__(self, instance, owner):
        return self.value


class User:
    high = NonField()


if __name__ == '__main__':
    user = User()
    user.high = '175'    #会放入user.__dict__中
    print(user.__dict__)
Copier après la connexion

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!

Étiquettes associées:
source:segmentfault.com
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