59 votes

Mot-clé 'self' en python

Je suis nouveau sur Python (travaille généralement sur C #), j'ai commencé à l'utiliser au cours des derniers jours.

Au sein d'une classe, devez-vous préfixer tout appel à ces méthodes, membres de données et méthodes? Ainsi, si j'appelle une méthode ou obtient une valeur de cette classe, elle doit utiliser self.method () ou self.intvalue, par exemple?

Je veux juste vérifier qu'il n'y a pas une manière moins verbeuse que je n'ai pas encore rencontrée.

Merci.

123voto

Sven Marnach Points 133943

Il n'y a pas de manière moins verbeuse. Utilisez toujours self.x pour accéder à l'attribut d'instance x . Notez que contrairement à this en C ++, self n'est pas un mot clé, cependant. Vous pouvez attribuer le nom de votre choix au premier paramètre de votre méthode, mais il est fortement recommandé de s'en tenir à la convention consistant à l'appeler self .

55voto

ncoghlan Points 10779

Je vais compléter Sven est (précis) de la réponse avec la réponse de la nature à la question de suivi (c'est à dire Pourquoi est - self explicite plutôt qu'implicite?).

Python fonctionne de cette façon qu'il opère sur l'idée de la portée lexicale: les références de nom va toujours se référer à une variable locale dans la fonction en cours de définition, une variable locale d'une fonction contenante définition, une variable globale du module, ou d'une interface. (Le champ lexical que lorsque vous suivez l'arbre d'analyse vers le bas pendant le symbole de l'analyse, vous avez seulement besoin de se rappeler les noms vu dans les définitions de fonction sur le chemin vers le bas pour la fonction en cours - rien d'autre ne peut être traité comme "pas vu, donc globale ou intégrée". Il est également intéressant explicitement de noter que les règles de portée liés à l'imbrication de la fonction des définitions plutôt que des appels).

Les méthodes ne sont pas donnés à tout particulier d'un traitement spécial à cet égard de la classe états sont largement hors de propos à la portée lexicale règles, car il n'y a pas la même forte de la fonction vs méthode de distinction qui existe dans certaines langues (au Lieu de cela, les méthodes sont créées dynamiquement à partir de fonctions lorsque les attributs pertinents sont récupérées à partir d'objets).

Ceci permet de faire une fonction pour être ajouté à une classe après qu'il a déjà été définis et être impossible à distinguer de ceux des méthodes qui ont été définis dans le corps de la déclaration de classe (un processus connu sous le nom "monkeypatching").

Depuis l'objet d'espaces de noms sont séparés de la portée lexicale de règles, il est nécessaire de prévoir une autre façon de faire référence à ces attributs. C'est la tâche effectuée par l'explicite self.

Notez que pour des algorithmes complexes, il n'est pas rare de cache des références à des variables membres comme des variables locales à l'intérieur de la méthode.

8voto

Xiao Hanyu Points 131

Tout d'abord, Python self n'est pas un mot clé, c'est une convention de codage, le même que Python cls.

Guido a écrit un très détaillées et précieuses article sur l'origine de Python soutien pour la classe, et dans cet article, Guido explique pourquoi utiliser self et cls, et pourquoi ils sont nécessaires.

Voir http://python-history.blogspot.com/2009/02/adding-support-for-user-defined-classes.html.

Si vous êtes intéressé par les sujets de pointe comme ça, alors je le conseille de vous référer à "Pro Python" écrit par Marty Alchin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X