Общее имя python 'self' не определено

Просто начал изучать 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 для ссылки на переменные разных методов в некотором коде, который я читал, который работает нормально.

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

Ответ 1

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() 

Взгляните на раздел "Классы" руководства по Python и Погрузитесь в Python для получения дополнительных ссылок.

Ответ 2

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

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

a = A()
a.f()

Вы получите что-то вроде

<__main__.A object at 0x02A9ACF0>

Ответ 3

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

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()  

Ответ 4

Если вы исходите из такого языка, как 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

Ответ 5

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

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