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

巴扎黑
Libérer: 2017-08-16 13:44:27
original
1594 Les gens l'ont consulté

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)
Copier après la connexion

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;
Copier après la connexion

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())
Copier après la connexion

Résultat de sortie :

6 10
Copier après la connexion

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()
Copier après la connexion

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()
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!