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)

不言
不言avant
2018-12-12 10:37:112837parcourir

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()
__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    #正确执行,不报错
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属性
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__)

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer