Pourquoi les variables d'instance doivent-elles être définies à l'intérieur des méthodes? En d'autres termes, pourquoi ne doit être utilisé que pour définir de nouvelles variables à l'intérieur des méthodes d'une classe. Pourquoi ne pouvez-vous pas définir les variables en utilisant soi-même dans le cadre de la classe, mais en dehors des méthodes. p>
"Les variables d'instance sont ces variables pour lesquelles chaque objet de classe a sa propre copie de celui-ci" - Cette définition ne dit rien sur les méthodes. Donc, étant donné que la définition ne mentionne pas les méthodes, pourquoi ne pouvez-je pas définir une variable d'instance (en d'autres termes, utilisez-la pour définir une nouvelle variable) à l'intérieur d'une classe, mais en dehors d'une méthode? p>
4 Réponses :
Parce que le mécanisme utilisé par Python pour faire face à OOP est très simple. Il n'y a pas de syntaxe spéciale pour définir réellement les classes, le mot-clé code> est une couche très mince sur ce qui constitue la création d'un dict code>. Tout ce que vous définissez à l'intérieur d'un classe FOO: code> finalement finit comme le contenu de foo .__ dict __ code>. Il n'y a donc pas de syntaxe pour définir les attributs de l'instance résultant de l'appelant foo () code>. Vous ajoutez des attributs d'instance simplement en les attachant à l'objet que vous obtenez de l'appelant foo () code>, qui est auto code> dans __ init __ code> ou d'autres méthodes d'instance. p>
python nécessite la référence d'objet (implicite ou explicite si vous définissez p> il n'y a pas ceci code> en Java, par exemple) pour être explicite. Méthodes intérieures - Fonctions liées - Le premier paramètre de la définition de la fonction est l'instance. (Ceci est classiquement appelé auto code> mais vous pouvez utiliser n'importe quel nom.) auto < / code> référence, contrairement, par exemple Java, où ceci code> est implicite. p> p>
Pour cela pour répondre, vous devez connaître un peu comment fonctionne l'interprète Python. P>
En général, chaque définition de classe et de méthode sont des objets distincts.
Ce que vous faites lorsque vous appelez une méthode, c'est que vous passez l'instance de classe comme premier paramètre à la méthode. Avec cela, la méthode sait sur quelle instance il exécute (et donc où allouer des variables d'instance à).
Cela compte cependant que des méthodes d'instance.
Bien sûr, vous pouvez également créer des méthodes de classe avec @classmethod code> Celles-ci prennent le type de classe comme argument au lieu d'une instance et ne peuvent donc pas être utilisés pour créer des variables sur le contexte auto code>. < / p>
Pourquoi les variables d'instance doivent-elles être définies à l'intérieur des méthodes? P>
Ils ne le font pas. Vous pouvez les définir de n'importe où,
tant que vous avez une instance forte> (d'un type mutable): p> xxx pré> blockQuote> En d'autres termes, pourquoi ne doit être utilisé que pour définir de nouvelles variables à l'intérieur des méthodes d'une classe. Pourquoi ne pouvez-vous pas définir les variables en utilisant soi-même dans le cadre de la classe, mais en dehors des méthodes. P> blockQuote>
auto code> (qui n'est qu'une convention de dénomination, Il y a Absolument rien de magique ici ) est utilisé pour représenter l'instance actuelle. Comment pouvez-vous l'utiliser au niveau de haut niveau de la classe où vous n'avez aucune instance du tout (et même pas la classe elle-même FWIW)? P>Définition des «membres» de la classe à la classe supérieure - Le niveau est surtout une chose de langues statiques, où les "objets" sont principalement (techniquement) des structures (structs de style C ou des enregistrements de style Pascal si vous préférez) avec une structure de mémoire définie statique. p>
python est une langue dynamique qui utilise plutôt
dict code> comme structure de données de support, doncpersonnobj.attribute code> est généralement (moins d'attributs calculés, etc.) résolus commeTOOOBJ .__ DICT __ ["Attribut"] CODE> (etTOOROBJ.ATTRIBUTE = VALUE CODE> ASTOOOBJ .__ DICT __ ["Attribute] = valeur code>). p>SO 1 / Il n'a pas besoin d'avoir une structure de données fixe, explicite définie, et que 2 / pourtant, il est nécessaire d'avoir une instance à la fin pour définir un attribut sur celui-ci. P> < P> Notez que vous pouvez forcer une classe à utiliser une structure de mémoire fixe (à la place d'une dicte simple) Utilisation de machines à sous , mais vous aurez toujours besoin de définir les valeurs de l'intérieur d'une méthode (canoniquement le
__ init __ code>, qui existe pour cette raison même: initialisation des attributs de l'instance). < / p> blockQuote>
Pourquoi pensez-vous que vous ne pouvez pas? Quelle est votre raison de croire que?
Parce que dans la classe
auto code> n'existe pas, il est passé dans les appels de méthode. Notez queauto code> n'est pas un mot réservé.Checkout docs.pytthon.org/3.7/TorTorial/classes.html#Class -Objects