web-dev-qa-db-fra.com

le nom global python 'self' n'est pas défini

Je viens juste de commencer à apprendre le python et je suis sûr que c’est une question stupide, mais j’essaie quelque chose comme ceci:

    def setavalue(self):
        self.myname = "harry"

    def printaname():
        print "Name", self.myname     

    def main():
        printname()




    if __== "__main__":
        main() 

L'erreur que je reçois est la suivante:

 NameError: global name 'self' is not defined

J'ai vu cette façon d'utiliser l'auto-déclaration pour référencer les variables de différentes méthodes dans un code que j'ai lu et qui fonctionne très bien.

Merci pour l'aide

13
harry

self est l'auto-référence dans une classe. Votre code n'est pas dans une classe, vous n'avez que des fonctions définies. Vous devez envelopper vos méthodes dans une classe, comme ci-dessous. Pour utiliser la méthode main(), vous devez d'abord instancier un objet de votre classe et appeler la fonction sur l'objet. 

De plus, votre fonction setavalue devrait être dans __init___, la méthode appelée lors de l'instanciation d'un objet. La prochaine étape que vous devriez probablement examiner consiste à fournir le nom en tant qu'argument à init, afin que vous puissiez créer des objets de nom arbitraire de la classe Name;) 

class Name:
    def __init__(self):
        self.myname = "harry"

    def printaname(self):
        print "Name", self.myname     

    def main(self):
        self.printaname()

if __== "__main__":
    objName = Name()
    objName.main() 

Consultez le chapitre Classes du tutoriel Python an at Plongez dans Python pour plus de références.

28
Jacob

En Python, self est le nom conventionnel donné au premier argument des méthodes d'instance de classes, qui est toujours l'instance sur laquelle la méthode a été appelée:

class A(object):
  def f(self):
    print self

a = A()
a.f()

Vous donnera quelque chose comme

<__main__.A object at 0x02A9ACF0>
3
Nicola Musatti

Cela devrait être quelque chose comme:

class Person:
   def setavalue(self, name):         
      self.myname = name      
   def printaname(self):         
      print "Name", self.myname           

def main():
   p = Person()
   p.setavalue("harry")
   p.printaname()  
2
Jiri Kriz

Si vous venez d'un langage tel que Java, vous pouvez peut-être faire une sorte d'association entre self et this. self sera la référence à l'objet qui a appelé cette méthode, mais vous devez d'abord déclarer une classe. Essayer:

class MyClass(object)

    def __init__(self)
        #equivalent of constructor, can do initialisation and stuff


    def setavalue(self):
        self.myname = "harry"

    def printaname(self):
        print "Name", self.myname     

def main():
    #Now since you have self as parameter you need to create an object and then call the method for that object.
    my_obj = MyClass()
    my_obj.setavalue() #now my_obj is passed automatically as the self parameter in your method declaration
    my_obj.printname()


if __== "__main__":
    main()

Vous pouvez essayer quelques tutoriels de base sur Python comme ici: Guide Python

1
Bogdan

Le nom self est utilisé comme référence d'instance dans les instances de classe. Il n'est utilisé que dans les définitions de méthodes de classe. Ne l'utilisez pas dans les fonctions. 

Vous ne pouvez pas non plus faire référence à des variables locales d'autres fonctions ou méthodes. Vous pouvez uniquement référencer des attributs d'instance ou de classe en l'utilisant. 

0
Keith