Maison >développement back-end >Tutoriel Python >Introduction détaillée aux descripteurs d'attributs en python (exemple de code)
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
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!