0
votes

Pourquoi mettre une variable de propriété dans le constructeur

à partir d'autres langues, je suis utilisé pour coder une propriété Classe et, ensuite, je peux y accéder sans l'avoir dans le constructeur comme xxx p> Dans presque tous les exemples, j'ai travaillé à travers la variable de propriété était dans le constructeur self._value comme celui-ci xxx

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 dans le constructeur ?


3 commentaires

BTW Imprimer ('J'ai eu la valeur:' & Self._Value) doit être Imprimer ('J'ai obtenu la valeur:% d'% auto._value) 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 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.


3 Réponses :


4
votes

parce que @property 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 :

the @property décorateur tourne la méthode de tension () 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".

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:


0 commentaires

2
votes

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 Circle défini par son rayon, mais vous pouvez définir un @property pour le diamètre afin que vous puissiez toujours écrire Circle.Diamètre.

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.

juste une mise de côté: __ init __ n'est-ce pas un constructeur. Le constructeur pour les objets Python est __ nouveau __ et vous ne l'écrasez presque jamais.


0 commentaires

3
votes

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 __ init __ méthode - le Le véritable constructeur est nommé __ nouveau __ 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.

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 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.

É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 . 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.

the La classe 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é classe elle-même ou une instance de celui-ci). De plus, la syntaxe @Decorator 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": xxx

ceci: xxx

est juste un raccourci pour: xxx

ici I Ici, j'ai défini décorateur en fonction, mais n'importe quel objet appelable (un objet "appelable" est une instance d'une classe qui définit le __ appel __ 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).

alors retour à votre code: xxx

Vous pouvez alors vouloir inspecter la classe et un exemple de celui-ci: xxx

en conclusion: si vous espérez faire quelque chose d'utile avec une langue, vous devez apprendre cette langue , 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).

NB: Juste pour l'exhaustivité: Les objets Python peuvent peuvent être fabriqués " basé sur des structures "en utilisant __ slots __ - 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é).


0 commentaires