Donc, je viens de commencer à programmer en python et je ne comprends pas tout le raisonnement derrière "moi". Je comprends qu’elle est utilisée presque comme une variable globale, afin que les données puissent être transmises entre différentes méthodes de la classe. Je ne comprends pas pourquoi vous devez l'utiliser lorsque vous appelez une autre méthode de la même classe. Si je suis déjà dans cette classe, pourquoi dois-je le dire ??
par exemple, si j'ai: Pourquoi ai-je besoin de self.thing ()?
class bla:
def hello(self):
self.thing()
def thing(self):
print "hello"
Vous pouvez aussi créer des méthodes dans la classe static
, donc inutile de self
. Cependant, utilisez ceci si vous en avez vraiment besoin.
Le tiens:
class bla:
def hello(self):
self.thing()
def thing(self):
print "hello"
édition statique:
class bla:
@staticmethod
def hello():
bla.thing()
@staticmethod
def thing():
print "hello"
Une des raisons est de faire référence à la méthode de l'instance de cette classe particular dans laquelle le code doit être exécuté.
Cet exemple pourrait aider:
def hello():
print "global hello"
class bla:
def hello(self):
self.thing()
hello()
def thing(self):
print "hello"
b = bla()
b.hello()
>>> hello
global hello
Pour le moment, vous pouvez penser à la résolution d'un espace de noms.
La réponse courte est "parce que vous pouvez def thing(args)
en tant que fonction globale ou en tant que méthode d'une autre classe. Prenez cet exemple (horrible):
def thing(args):
print "Please don't do this."
class foo:
def thing(self,args):
print "No, really. Don't ever do this."
class bar:
def thing(self,args):
print "This is completely unrelated."
C'est mauvais. Ne fais pas ça. Mais si vous avez, vous pouvez appeler thing(args)
et quelque chose se produira. Cela peut potentiellement être une bonne chose si vous planifiez en conséquence:
class Person:
def bio(self):
print "I'm a person!"
class Student(Person):
def bio(self):
Person.bio(self)
print "I'm studying %s" % self.major
Le code ci-dessus fait en sorte que si vous créez un objet de la classe Student
et appelez bio
, il fera tout ce qui se serait passé s'il s'agissait de la classe Person
qui avait son propre bio
appelé et it 'fera sa propre chose après.
Cela entre dans l'héritage et d'autres choses que vous n'avez peut-être pas encore vues, mais attendez-vous avec impatience.
Pour moi, self ressemble à un définisseur de portée, avec self.foo () et self.bar indiquant la fonction et le paramètre défini dans la classe et non ceux définis aux autres endroits.
Il peut exister une autre fonction portant le même nom en dehors de votre classe .self
est une référence d'objet à l'objet lui-même. Par conséquent, elles sont identiques. Les méthodes Python ne sont pas appelées dans le contexte de l'objet lui-même. self
en Python peut être utilisé pour traiter des modèles d'objet personnalisés ou quelque chose de ce genre.
Un miroir reflète la différence avec Java et python: Java pourrait utiliser une méthode dans une classe sans self car le seul moyen d'appeler une méthode est de class ou obj, la voie est donc claire pour le compilateur. Bien que cela puisse confondre le traducteur de python et consomme beaucoup de temps pour rechercher la table des symboles sur tout l’espace de noms en temps d’exécution, car la méthode function et la méthode class sont les candidats potentiels pour un appel de fonction pour lequel le «self» n’est pas utilisé. Si cette pratique était utilisée, la vitesse de python serait encore une fois ralentie par rapport à C et à Java, ce qui pourrait la rendre moins attrayante.