python全局名称';自我';没有定义

python全局名称';自我';没有定义,python,variables,self,Python,Variables,Self,刚开始学习python,我确信这是一个愚蠢的问题,但我正在尝试这样的方法: def setavalue(self): self.myname = "harry" def printaname(): print "Name", self.myname def main(): printname() if __name__ == "__main__": main() 我得到的错误

刚开始学习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语句引用不同方法变量的方法,这些代码运行良好


感谢您的帮助

self
是课堂上的自我参考。您的代码不在类中,您只定义了函数。您必须将方法封装在一个类中,如下所示。要使用方法
main()
,首先必须实例化类的一个对象并调用该对象上的函数

此外,函数
setavalue
应该位于
\uuuu init\uuuuuu
中,即实例化对象时调用的方法。您可能应该考虑的下一步是将名称作为参数提供给init,这样您就可以创建
name
class;)的任意命名对象


查看an at以获取更多参考。

在Python中,self是类的实例方法的第一个参数的常规名称,该参数始终是调用该方法的实例:

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

a = A()
a.f()
会给你类似的东西

<__main__.A object at 0x02A9ACF0>

类实例中将
self
名称用作实例引用。它仅在类方法定义中使用。不要在函数中使用它


您也不能使用它从其他函数或方法引用局部变量。您只能使用它引用实例或类属性

如果你来自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基本教程,如下所示:

它应该类似于:

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

将单独的函数转换为基于类的函数。
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()