à partir d'autres langues, je suis utilisé pour coder une propriété pour moi cela ne fait pas de sens Vous voulez la définir dans la propriété. Quelqu'un pourrait-il m'expliquer quelle est l'utilisation de la variable code> code> dans le constructeur Classe code> et, ensuite, je peux y accéder sans l'avoir dans le constructeur
code> comme
self._value code> comme celui-ci p>
code>? P> p>
3 Réponses :
parce que the Un objet de propriété contient des méthodes getter, setter et DELERSTER utilisables en tant que décorateurs qui créent une copie de la propriété avec la fonction d'accesseur correspondante définie sur la fonction décorée. Ceci est mieux expliqué avec un exemple: p>
blockQuote> @property code> n'est pas un décorateur pour une variable, il s'agit d'un Decorator pour fonction qui lui permet de se comporter comme une propriété. Vous devez toujours créer une variable de classe pour utiliser une fonction décorée par
@property code>: p>
@property code> décorateur tourne la méthode code> de tension () code> dans un "getter" pour un attribut en lecture seule avec le même nom et définit la docstring pour la tension pour "obtenir la tension actuelle". P>
Je suppose que vous venez d'une langue comme C ++ ou Java où il est courant de faire des attributs privés, puis écrivez des getters et des configurateurs explicites pour eux? En Python, il n'existe pas de privé autre que par convention et il n'est pas nécessaire d'écrire des getters et des setters pour une variable que vous n'avez besoin que d'écrire et de lire tel quel. @property et les décorateurs de réglage correspondants peuvent être utilisés si vous souhaitez ajouter un comportement supplémentaire (E.G. journalisation Acccess) ou vous souhaitez avoir des pseudo-propriétés que vous pouvez accéder à des vrais, par exemple. Vous pouvez avoir une classe Plus spécifiquement à votre question: Vous souhaitez avoir la propriété comme un argument de l'initialisateur si vous souhaitez définir la propriété au moment où vous créez l'objet. Vous ne voudriez pas créer un objet vide puis le remplir immédiatement avec des propriétés car cela créerait beaucoup de bruit et rendrait le code moins lisible. P>
juste une mise de côté: Circle code> défini par son rayon, mais vous pouvez définir un
@property code> pour le diamètre afin que vous puissiez toujours écrire Circle.Diamètre. P>
__ init __ code> n'est-ce pas un constructeur. Le constructeur pour les objets Python est
__ nouveau __ code> et vous ne l'écrasez presque jamais. P>
Les objets Python ne sont pas basés sur la structure (comme C ++ ou Java), ils sont basés sur dict (comme JavaScript). Cela signifie que les attributs d'instances sont dynamiques (vous pouvez ajouter de nouveaux attributs ou supprimer ceux existants au moment de l'exécution) et ne sont pas définis au niveau de la classe mais au niveau de l'instance, et ils sont définis tout simplement en leur attribuant simplement. Bien qu'ils puissent être définis techniquement n'importe où dans le code (même à l'extérieur de la classe), la Convention (et la bonne pratique) est de les définir (éventuellement aux valeurs par défaut) dans l'initialiszer (le Notez l'utilisation du terme "attribut" Ici - en Python, nous ne parlons pas de "variables de membre" ou de "fonctions membres" mais à propos de "attributs" et "méthodes". En fait, comme les classes Python sont également des objets (instance de la classe code> code> ou une sous-classe de), ils ont également des attributs, nous avons donc des attributs d'instance (qui sont par exemple) et des attributs de classe (qui appartiennent à l'objet de la classe elle-même et sont partagés entre des instances). Un attribut de classe peut être recherché sur une instance, tant que ce n'est pas ombré par un attribut d'instance du même nom. P> Également, car les fonctions Python sont également des objets (indice: en python, tout - tout ce que vous pouvez mettre sur le RHS d'une affectation qui est - est un objet), il n'y a pas d'espaces de noms distincts pour "Données" Attributs et «Fonction» Les attributs et les «méthodes» de Python sont en réalité des fonctions définies sur la classe elle-même - Iow sont des attributs de classe qui se produisent des instances de la fonction code> code>. Les méthodes nécessaires pour accéder à l'instance pour pouvoir fonctionner dessus, Il y a un mécanisme spécial qui Autoriser à "personnaliser" l'accès à l'attribut donc un objet donné - s'il implémente l'interface appropriée - peut renvoyer quelque chose d'autre que lui-même lorsqu'il est levé sur une instance mais résolue sur la classe. Ce mécanisme est utilisé par des fonctions afin qu'ils se transforment en méthodes (objets appelables qui enveloppent la fonction et l'instance ensemble afin de ne pas avoir à transmettre l'instance à la fonction), mais aussi plus généralement comme support des attributs calculés. p> the ceci: p> est juste un raccourci pour: p> ici I Ici, j'ai défini alors retour à votre code: p> Vous pouvez alors vouloir inspecter la classe et un exemple de celui-ci: p> en conclusion: si vous espérez faire quelque chose d'utile avec une langue, vous devez apprendre cette langue em>, vous ne pouvez pas Attendez-vous à ce que cela fonctionne comme d'autres langues que vous connaissez. Alors que certaines fonctionnalités sont basées sur des concepts communs (c.-à-d. Fonctions, classes, etc.), ils peuvent en réalité être mis en œuvre de manière totalement différente (le modèle d'objet de Python n'a presque rien en commun avec Java's One), alors essayant simplement d'écrire Java (ou C ou C ++ etc) en Python ne fonctionnera pas (comme essayer d'écrire Python dans Java Fwiw). P> NB: Juste pour l'exhaustivité: Les objets Python peuvent em> peuvent être fabriqués " basé sur des structures "en utilisant __ init __ code> méthode - le Le véritable constructeur est nommé
__ nouveau __ code> mais il y a très peu de raisons de le remplacer) pour préciser les attributs dont une instance d'une classe donnée est supposée avoir.
La classe code> est une implémentation générique d'attributs calculés qui enveloppe une fonction getter (et éventuellement un setter et un Delier) - donc dans la "propriété" de Python a une signification très spécifique (la
propriété code> classe elle-même ou une instance de celui-ci). De plus, la syntaxe
@Decorator code> n'est rien de magique (et n'est pas spécifique aux propriétés), il ne s'agit que de sucre syntaxique, donc donné une fonction "décorateur": p>
décorateur code> en fonction, mais n'importe quel objet appelable (un objet "appelable" est une instance d'une classe qui définit le
__ appel __ code> méthode magique) peut être utilisé à la place - et les classes Python sont des appelables (c'est même en fait en appelant une classe que vous l'instachez). p>
__ slots __ code> - mais l'objectif ici n'est pas d'empêcher d'ajouter de manière dynamique des attributs (ce qui n'est qu'un effet secondaire), mais pour faire des instances de ces classes" plus légères "de taille (ce qui est utile lorsque Vous savez que vous allez avoir des milliers ou plus d'instances d'entre eux à un moment donné). P> P>
BTW
Imprimer ('J'ai eu la valeur:' & Self._Value) Code> doit être
Imprimer ('J'ai obtenu la valeur:% d'% auto._value) code> Je suppose.
Que voulez-vous dire "le mettre dans la propriété"? Cette propriété n'est pas réglée.
Il est facile de comprendre, nous utilisons
@property code> pour obtenir une valeur dynamique. L'exemple le plus simple pourrait être une valeur basée sur l'heure actuelle. Ce n'est pas une valeur statique, vous ne pouvez donc pas l'affecter pendant le temps d'initialisation.