Je suis généralement confus au sujet de la différence entre une «propriété» et un «attribut», et je ne peux pas trouver une excellente ressource pour détailler de manière concise les différences.
146
Les propriétés sont un type particulier d'attribut. Fondamentalement, lorsque Python rencontre le code suivant:
spam = SomeObject()
print(spam.eggs)
il recherche eggs
dans spam
et examine ensuite eggs
pour voir si elle a __get__
, __set__
ou __delete__
méthode - si elle le fait, il est une propriété. S'il s'agit d' une propriété, au lieu de simplement renvoyer l' eggs
objet (comme pour tout autre attribut), il appellera la __get__
méthode (puisque nous faisions la recherche) et retournera tout ce que cette méthode renvoie.
Plus d'informations sur le modèle de données et les descripteurs de Python .
Avec une propriété, vous avez un contrôle complet sur ses méthodes getter, setter et deleter, que vous n'avez pas (si vous n'utilisez pas de mises en garde) avec un attribut.
la source
x
. Une manière. Si l'utilisateur de la classe découvre _x, il l'utilise à ses propres risques.En termes généraux, une propriété et un attribut sont la même chose. Cependant, il existe un décorateur de propriété en Python qui fournit un accès getter / setter à un attribut (ou à d'autres données).
la source
La propriété vous permet d'obtenir et de définir des valeurs comme vous le feriez avec des attributs normaux, mais en dessous se trouve une méthode appelée pour la traduire en un getter et un setter pour vous. C'est vraiment juste une commodité de réduire le passe-partout de l'appel des getters et des setters.
Disons, par exemple, que vous aviez une classe qui contenait des coordonnées x et y pour quelque chose dont vous aviez besoin. Pour les définir, vous voudrez peut-être faire quelque chose comme:
C'est beaucoup plus facile à regarder et à penser que d'écrire:
Le problème est, que se passe-t-il si un jour votre classe change de telle sorte que vous devez compenser vos x et y d'une certaine valeur? Maintenant, vous devez entrer et modifier la définition de votre classe et tout le code qui l'appelle, ce qui pourrait prendre beaucoup de temps et être source d'erreurs. La propriété vous permet d'utiliser la première syntaxe tout en vous offrant la flexibilité de changement de la seconde.
En Python, vous pouvez définir des getters, des setters et des méthodes de suppression avec la fonction de propriété. Si vous voulez juste la propriété read, il existe également un décorateur @property que vous pouvez ajouter au-dessus de votre méthode.
http://docs.python.org/library/functions.html#property
la source
J'ai appris 2 différences sur le site de Bernd Klein, en résumé:
1. La propriété est un moyen plus pratique d'encapsuler des données.
ex: Si vous avez un attribut public de longueur Object, plus tard, votre projet vous demandera de l'encapsuler, c'est-à-dire: changez-le en privé et fournissez getter et setter => vous devez changer de nombreux codes que vous avez écrits auparavant:
Si vous utilisez @property et @ lenght.setter => vous n'avez pas besoin de changer ces anciens codes
2. Une propriété peut encapsuler plusieurs attributs
Dans cet exemple,
__physic_health
et__mental_health
sont privés et ne sont pas accessibles directement de l'extérieur, le seul moyen d'interagir avec les classes extérieures est via la propriétécondition
la source
Il y a aussi une différence non évidente que j'utilise pour mettre en cache ou actualiser les données, souvent nous avons une fonction connectée à l'attribut de classe. Par exemple, je dois lire le fichier une fois et conserver le contenu attribué à l'attribut afin que la valeur soit mise en cache:
Production:
Nous avons accédé à l'attribut deux fois mais notre fonction n'a été déclenchée qu'une seule fois. La modification de l'exemple ci-dessus pour utiliser la propriété entraînera l'actualisation de la valeur de l'attribut chaque fois que vous y accédez:
Production:
la source