Un descripteur est une classe qui possède les méthodes suivantes.
Méthode | Calendrier des appels |
---|---|
get(self,obj,type) | Lors de la récupération des attributs |
set(self,obj,value) | Lors de la définition des attributs |
delete(self,obj) | Lors de la suppression d'un attribut |
Puisqu'il s'agit d'une méthode différente des méthodes spéciales telles que getattr et setattr, elle doit être reconnue séparément du descripteur.
-Les comportements liés aux opérations d'attributs peuvent être découpés dans une autre classe (= les fonctions liées aux attributs qui couvrent les classes peuvent être réutilisées.) -Peut définir un comportement qui ne s'applique qu'à des attributs spécifiques. (getattr, setattr affecte tous les attributs de cette classe)
Il y a un mérite du bol. Les descripteurs sont également utilisés derrière les propriétés, les classes / méthodes statiques, super, etc.
descriptor_basic.py
#Définition du descripteur
class LogProp:
def __init__(self,name): #1
self.name = name #1
#Traitement lors de la récupération des attributs
def __get__(self,obj,type): #2
prin(f'{self.name}:get') #2,6
return obj.__dict__[self.name] #2,4
#Traitement lors de la définition des attributs
def __set__(self,obj,value) #3
prin(f'{self.name}:set{value}') #3,7
obj.__dict__[self.name] = value #3,5
class App:
#Définition du descripteur
title = LogProp('title') #8
if __name__ == '__main__':
app = App()
app.title = 'Python d'auto-apprentissage' #9
print(app.title) #9
Le côté descripteur définit init, get, set. Tout d'abord, la méthode init (# 1) reçoit et stocke le nom d'attribut qui est la cible du descripteur. Ce sont les informations clés pour passer des valeurs plus tard.
Et set (# 2), get (# 3) sont les principales méthodes de transmission des valeurs. get et set reçoivent les informations suivantes via des arguments.
obj: instance cible type: Classe cible valeur: valeur passée
Dans cet exemple, la valeur de l'instance est obtenue et référencée via dict. Puisque get et set reprennent l'opération d'attribut de l'instance, l'acquisition et la définition de la valeur d'attribut seront invalides s'il n'y a aucune opération pour acquérir ou enregistrer une valeur.
Réduisez la description comme # 4 et 5 dans le code, et ajoutez des opérations supplémentaires lors de l'obtention et du réglage. Dans cet exemple, le résultat de l'acquisition et du réglage est sorti par impression.
Pour associer un descripteur prédéfini à un attribut, utilisez # 8. (C'est de la même manière que vous écrivez une propriété avec une fonction de propriété.)
Vous pouvez confirmer que le journal est sorti au moment où le titre est défini comme # 9 dans le code.
Python d'auto-apprentissage cité dans le chapitre 11 Syntaxe orientée objet
Recommended Posts