Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation du décorateur property() de Python

Explication détaillée de l'utilisation du décorateur property() de Python

巴扎黑
巴扎黑original
2017-08-16 13:44:271579parcourir

1. Qu'est-ce qu'un décorateur ?

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

2. function Property() Une brève discussion

2.1 Pourquoi utiliser la propriété ?

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.

2.2 Prototype de fonction :

property(fget=None, fset=None, fdel=None, doc=None)

2.3 Définition de méthode commune :

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: &#39;Normal&#39; object has no attribute &#39;__count&#39;

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.

Méthode 1 : Utiliser la propriété function property()

class Normal:
    def __init__(self):
        self.__x = None
    def getx(self):
        print(&#39;getx(): self.__x=&#39;, self.__x)
        return self.__x
    def setx(self, value):
        self.__x = value
        print(&#39;setx()&#39;)
    def delx(self):
        print(&#39;delx()&#39;)
        del self.__x
    y = property(getx, setx, delx, "I&#39;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

Méthode 2 : Utiliser le @ property decorator

class Normal:
    
    def __init__(self):
        self.__x = None
    @property
    def xx(self):
        print(&#39;getx(): self.__x=&#39;, self.__x)
        return self.__x
    
    @xx.setter
    def xx(self, value):
        self.__x = value
        print(&#39;setx()&#39;)
    @xx.deleter
    def xx(self):
        print(&#39;delx()&#39;)
        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!

Déclaration:
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