глобальное имя python 'self' не определено - PullRequest
15 голосов
/ 11 августа 2011

Только начал изучать Python, и я уверен, что это глупый вопрос, но я пытаюсь что-то вроде этого:

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

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

    def main():
        printname()




    if __name__ == "__main__":
        main() 

Я получаю ошибку:

 NameError: global name 'self' is not defined

Я виделэтот способ использования оператора self для ссылки на переменные различных методов в некотором коде, который я прочитал, работает нормально.

Спасибо за помощь

Ответы [ 5 ]

30 голосов
/ 11 августа 2011

self - это собственная ссылка в классе. Ваш код не в классе, у вас есть только определенные функции. Вы должны обернуть свои методы в классе, как показано ниже. Чтобы использовать метод main(), сначала необходимо создать экземпляр объекта вашего класса и вызвать функцию для этого объекта.

Кроме того, ваша функция setavalue должна быть в __init___, метод, вызываемый при создании экземпляра объекта. Следующим шагом, который вы, вероятно, должны рассмотреть, является предоставление имени в качестве аргумента для init, чтобы вы могли создавать объекты с произвольным именем класса Name;)

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

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

    def main(self):
        self.printaname()

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

Посмотрите главу Classes в руководстве по Python a на Погрузитесь в Python для дальнейших ссылок.

3 голосов
/ 11 августа 2011

В Python self - это условное имя, данное первому аргументу методов экземпляра классов, который всегда является экземпляром, для которого был вызван метод:

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

a = A()
a.f()

даст вам что-то вроде

<__main__.A object at 0x02A9ACF0>
2 голосов
/ 11 августа 2011

Это должно быть что-то вроде:

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()  
1 голос
/ 11 августа 2011

Если вы пришли из такого языка, как Java, возможно, вы можете установить какую-то связь между self и this. self будет ссылкой на объект, вызвавший этот метод, но сначала вам нужно объявить класс. Попробуйте:

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 __name__ == "__main__":
    main()

Вы можете попробовать базовое руководство по Python, как здесь: Руководство по Python

0 голосов
/ 11 августа 2011

Имя self используется в качестве ссылки на экземпляр в экземплярах класса.Он используется только в определениях методов класса.Не используйте это в функциях.

Вы также не можете ссылаться на локальные переменные из других функций или методов.Вы можете ссылаться только на атрибуты экземпляра или класса, используя его.

...