python全局名称'self'未定义

时间:2011-08-11 10:41:07

标签: python variables 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语句引用我读过的一些代码中不同方法的变量的方法。

感谢您的帮助

5 个答案:

答案 0 :(得分:29)

self是Class中的自引用。您的代码不在类中,您只定义了函数。你必须将你的方法包装在一个类中,如下所示。要使用方法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 chapter of the Python tutorialDive into Python以获取进一步的参考资料。

答案 1 :(得分:3)

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

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

a = A()
a.f()

会给你类似的东西

<__main__.A object at 0x02A9ACF0>

答案 2 :(得分:2)

应该是这样的:

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

答案 3 :(得分:1)

如果您来自Java等语言,您可以在selfthis之间建立某种关联。 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 guide

答案 4 :(得分:0)

self名称用作类实例中的实例引用。它仅用于类方法定义。不要在功能中使用它。

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