Quand utilisez-vous "self" en Python?

Êtes-vous censé utiliser self lorsque vous référencez une fonction membre en Python (dans le même module)?

plus généralement, je me demandais quand il faut utiliser self, pas seulement pour les méthodes mais aussi pour les variables.

25
demandé sur agf 2011-10-11 09:59:29

4 réponses

ajouter une réponse parce que Oskarbi n'est pas explicite.

Vous utilisez self alors:

  1. définition d'une méthode d'instance. Il est transmis automatiquement comme premier paramètre lors de l'appel d'une méthode sur une instance, et c'est l'instance sur laquelle la méthode a été appelée.
  2. référencement d'un classe ou instance l'attribut de l'intérieur d'une méthode d'instance. Utilisez - le vous voulez appeler une méthode ou accéder à un nom (variable) sur l'instance la méthode a été appelé, de l'intérieur de cette méthode.

Vous ne pas utiliser self quand

  1. Vous appelez une méthode d'instance normalement. En utilisant L'exemple D'Oskarbi, si vous faites instance = MyClass(), vous appelez MyClass.my_methodinstance.my_method(some_var)instance.my_method(self, some_var).
  2. Vous faites référence à un attribut de classe de dehors une méthode d'instance mais à l'intérieur de la définition de classe.
  3. vous êtes dans un staticmethod.

Ces ne sont que des exemples de situations où il ne faut pas se servir de soi-même. Les dos sont quand vous devrait l'utiliser.

25
répondu agf 2011-10-11 06:51:51

Utiliser self pour consulter les variables d'instance et les méthodes d'autres méthodes d'instance. Aussi mettre self le premier paramètre dans la définition de méthodes d'instance.

Un exemple:

class MyClass(object):

    my_var = None

    def my_method(self, my_var):
         self.my_var = my_var
         self.my_other_method()

    def my_other_method(self):
         # do something...
13
répondu Oskarbi 2016-10-18 15:58:02

par exemple variable et pour les méthodes, il est obligatoire d'utiliser self à tout moment.

3
répondu lc2817 2011-10-11 06:04:01
  1. Il y a rien "spécial" sur le nom self. C'est le nom préféré par convention par Pythonistas, pour indiquer ce que ce paramètre est censé contenir.

  2. L'exécution Python passera une valeur "self" lorsque vous appelez une méthode d'instance sur une instance, que vous l'ayez délibérément prévue ou non. Cela se traduira généralement par une erreur facilement diagnostiquée / comprise (puisque la fonction sera appelée avec le mauvais nombre de paramètres), mais l'utilisation de *args peut conduire à des erreurs de type plus étranges.

  3. Le paramètre est transmis implicitement lorsque vous appelez une méthode d'instance sur une instance. Il contient l'instance sur laquelle vous appelez la méthode. Si vous ne faites pas mention self dans l'appel de fonction parce que (a) comme indiqué ci-dessus, cela n'aurait aucun sens (il n'y a pas de self en portée, en général, et self n'est pas un mot clé ou un nom spécial ou quoi que ce soit d'autre); (b) vous avez déjà indiqué l'instance à utiliser (en écrivant my_instance.).

  4. vous pouvez, bien sûr, appeler explicitement une méthode d'instance en y accédant depuis la classe. Dans ce cas, vous devrez passer l'instance explicitement comme premier paramètre. En général, vous ne voulez pas faire ça. Et vous surtout Je ne veux pas écrire de code qui considère la possibilité que le premier paramètre soit quelque chose d'autre qui a été explicitement passé de cette façon. Ceci est similaire à la vérification de l' if (this == null) en C++: vous ne pouvez pas faire cela, parce que si il pourrait peut-être dire quelque chose, puis le code d'appel est mauvais, moralement, sinon légalement. (Au moins en Python, vous n'aurez pas de problèmes avec un comportement non défini, mais c'est moralement faux.)

  5. dans la méthode instance, depuis self est un paramètre qui a été assigné à l'instance comme valeur, vous pouvez écrire self.whatever pour accéder aux attributs du instance. Contrairement à certains autres " implicite this' style de langues, les noms d'attributs sont implicitement "portée".

  6. Il n'y a pas d'autres cas d'utilisation pour l' self, car là encore ce n'est pas un nom spécial, et c'est le seul but spécifique que la convention de nommage adresse. Si vous aviez besoin d'accéder à une "variable" (en fait un attribut) à partir d'un autre module, vous utiliseriez le nom du module. Si vous voulais un accès à partir du module courant, pas le préfixe est nécessaire, ou même possible. (Eh bien, vous cherchez explicitement dans le dict retournée par globals(), mais s'il vous plaît ne faites pas cela.)

3
répondu Karl Knechtel 2011-10-11 21:58:39