Общее имя 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
используется как ссылка экземпляра в экземплярах класса. Он используется только в определениях метода класса. Не используйте его в функциях.
Вы также не можете ссылаться на локальные переменные из других функций или методов с ним. Вы можете ссылаться только на атрибуты экземпляра или класса.