Maison > Article > développement back-end > Explication détaillée de l'utilisation du décorateur property() de Python
Définition officielle : Decorator est un modèle de conception bien connu qui est souvent utilisé dans des scénarios avec des exigences transversales. Les plus classiques incluent l'insertion de journaux, les tests de performances, le traitement des transactions, etc. Les décorateurs sont une excellente conception pour résoudre ce genre de problème. Avec les décorateurs, nous pouvons extraire le même code dans un grand nombre de fonctions qui n'a rien à voir avec la fonction elle-même et continuer à le réutiliser. En un mot, le but d’un décorateur est d’ajouter des fonctionnalités supplémentaires à un objet existant.
Python comprend un total de trois décorateurs intégrés :
① staticmethod
② classmethod
③ property
Habituellement, lorsque nous accédons à des attributs et attribuons des valeurs aux attributs, nous traitons de classes et d'instances __dict__ ; mais si nous voulons standardiser l'accès aux attributs, deux manières sont disponibles : ① Descripteur de données, ②. () fonction de propriété.
Cependant, nous savons que les descripteurs sont relativement complexes et difficiles à utiliser pour les novices, vous pourriez donc aussi bien essayer property(). Par rapport au vaste processus des descripteurs, property équivaut à un fil de discussion.
property(fget=None, fset=None, fdel=None, doc=None)
Supposons qu'il existe une variable privée __x dans calss Normal, comme indiqué dans le code suivant :
#code 1 class Normal: def __init__(self): self.__x = None def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x tN = Normal() print(tN.__count)
Résultat de sortie (une erreur est signalée)
Traceback (most recent call last): File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module> print(tN.__count) AttributeError: 'Normal' object has no attribute '__count'
Pourquoi une erreur est-elle signalée ? Parce que l'attribut __x de l'instance tN est un attribut privé et n'est pas accessible directement, nous ne pouvons appeler que la méthode définie en interne
tN = Normal() tN.setx(10) print(tN.getx())
Résultat de sortie :
6 10
Utiliser l'attribut interne ; Méthode, vous pouvez facilement obtenir la valeur de l'attribut privé d'une instance ou d'une classe ;
Cependant, si je souhaite changer le nom de la méthode setx de la classe Normal en quelque chose d'autre (comme Normal_setx), cette fonction est utilisée dans de nombreux emplacements externes. Dois-je trouver l'emplacement d'appel de la méthode un par un, puis le modifier un par un ?
Le langage C est peut-être capable de le faire, mais Python, un langage de haut niveau, comment ne peut-il pas résoudre un tel problème ?
Alors, comment résoudre les problèmes ci-dessus ?
Il existe en fait deux méthodes.
class Normal: def __init__(self): self.__x = None def getx(self): print('getx(): self.__x=', self.__x) return self.__x def setx(self, value): self.__x = value print('setx()') def delx(self): print('delx()') del self.__x y = property(getx, setx, delx, "I'm a property") tN=Normal() tN.y=10 tN.y del tN.y #输出结果: setx() getx(): self.__x= 10 delx()
La méthode est directement exploitée comme une propriété, ce qui est très pratique
class Normal: def __init__(self): self.__x = None @property def xx(self): print('getx(): self.__x=', self.__x) return self.__x @xx.setter def xx(self, value): self.__x = value print('setx()') @xx.deleter def xx(self): print('delx()') del self.__x tN=Normal() tN.xx=10 tN.xx del tN.xx #输出结果信息: setx() getx(): self.__x= 10 delx()
Le résultat est le même que celui de la méthode 1, ce qui prouve que les deux méthodes sont réalisables (remarque : la première doit être @property (en remplaçant le getter, sinon une erreur sera signalée)).
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!