Quand utilisez-vous "self" en Python?
4 réponses
ajouter une réponse parce que Oskarbi n'est pas explicite.
Vous utilisez self
alors:
- 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.
- 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
- Vous appelez une méthode d'instance normalement. En utilisant L'exemple D'Oskarbi, si vous faites
instance = MyClass()
, vous appelezMyClass.my_method
instance.my_method(some_var)
instance.my_method(self, some_var)
. - 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.
- 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.
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...
par exemple variable et pour les méthodes, il est obligatoire d'utiliser self à tout moment.
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.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.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 deself
en portée, en général, etself
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 écrivantmy_instance.
).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.)dans la méthode instance, depuis
self
est un paramètre qui a été assigné à l'instance comme valeur, vous pouvez écrireself.whatever
pour accéder aux attributs du instance. Contrairement à certains autres " implicitethis
' style de langues, les noms d'attributs sont implicitement "portée".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 ledict
retournée parglobals()
, mais s'il vous plaît ne faites pas cela.)