Python全局名称'self'未定义

23

我刚开始学习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语句来引用不同方法的变量的方法,这个方法目前运行良好。

感谢您的帮助。


将您的独立函数转换为基于类的形式。 - Yajushi
5个回答

43
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进行进一步参考。


6

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

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

a = A()
a.f()

会给你类似以下的东西。
<__main__.A object at 0x02A9ACF0>

4

如果你来自像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指南

4
应该是这样的:

它应该类似于:

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

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接