Python中的main方法

时间:2012-01-10 21:29:23

标签: python

我有以下代码,它有以下两个问题:

Traceback (most recent call last):
  File "C:\Users\v\workspace\first\src\tests.py", line 1, in <module> 
  class Animal:
  File "C:\Users\v\workspace\first\src\tests.py", line 39, in Animal

  File "C:\Users\v\workspace\first\src\tests.py", line 31, in main
    dog = Animal()
NameError: global name 'Animal' is not defined

此代码来自教程,在本教程中它可以正常工作。我有Python 2.7并使用Eclipse的PyDev插件。

  class Animal:
    __hungry = "yes"
    __name = "no name"
    __owner = "no owner"

    def __init__(self):
        pass

    def set_owner(self,newOwner):
        self.__owner= newOwner
        return

    def get_owner(self):
        return self.__owner

    def set_name(self,newName):
        self.__name= newName
        return

    def get_name(self):
        return self.__name

    def noise(self):
        print('errr')
        return

    def __hiddenmethod(self):
        print("hard to find")


    def main():
        dog = Animal()    
        dog.set_owner('Sue')
        print dog.get_owner()
        dog.noise()


    if  __name__ =='__main__':main()

6 个答案:

答案 0 :(得分:35)

此代码:

def main():
    dog = Animal()    
    dog.set_owner('Sue')
    print dog.get_owner()
    dog.noise()


if  __name__ =='__main__':main()

不应该在课堂上。当你把它带到外面(没有缩进)它应该工作。

因此,考虑到这一点后,它应该是这样的:

class Animal:
    __hungry = "yes"
    __name = "no name"
    __owner = "no owner"

    def __init__(self):
        pass

    def set_owner(self,newOwner):
        self.__owner= newOwner
        return

    def get_owner(self):
        return self.__owner

    def set_name(self,newName):
        self.__name= newName
        return

    def get_name(self):
        return self.__name

    def noise(self):
        print('errr')
        return

    def __hiddenmethod(self):
        print("hard to find")


def main():
    dog = Animal()    
    dog.set_owner('Sue')
    print dog.get_owner()
    dog.noise()


if  __name__ =='__main__':
    main()

答案 1 :(得分:25)

要理解为什么你写的内容失败了,你需要了解一下类定义在Python中是如何工作的。您可能知道,Python是一种解释型语言:有一个程序可以读取Python文件并在其中执行它们。当解释器遇到类定义时,它会执行以下操作:

  1. 创建一个新的命名空间(所有变量名的记录),其中将存储类变量和方法。
  2. 提取类定义中的所有代码(由其缩进确定)并运行该代码。这将填充它刚刚创建的命名空间。
  3. 创建一个新的类对象,其名称空间如上所述,以及定义中给出的基类。
  4. 将类的名称绑定到此对象。
  5. 那么当您在代码中缩进main函数时会发生什么?在第2步中,您引用了名称Animal。但直到第4步才定义此名称!实际上,不能在你提到的阶段定义,因为那将是循环的。当您在类定义之外移动main时,它将在步骤1-4完成之后才会执行,因此名称Animal将已被绑定。


    顺便说一句,你编写的代码不是很好的Python。您可能应该尝试找到更好的教程;通常的建议是“潜入Python”。我已经重写了它应该做的事情:

      class Animal(object):
          def __init__(self, hungry="yes", name=None, owner=None):
              self.hungry = hungry
              self.name = name
              self.owner = owner
    
          def noise(self):
              print('errr')
    
          def _internal_method(self):
              print("hard to find")
    
      if  __name__ =='__main__':
          dog = Animal()    
          dog.owner = 'Sue'
          print dog.owner
          dog.noise()
    

答案 2 :(得分:2)

以下构造在大多数代码中都值得拥有 - 特别是如果您在多个环境中运行。

if  __name__ =='__main__':
    main()

答案 3 :(得分:1)

main()方法和if __name__ == '__main__'语句移出类的范围。记住 - 空白计数。

答案 4 :(得分:1)

你的缩进是关闭的。请记住,在Python中,缩进很重要。尝试:

class Animal:
    __hungry = "yes"
    __name = "no name"
    __owner = "no owner"

    def __init__(self):
        pass

    def set_owner(self,newOwner):
        self.__owner= newOwner
        return

    def get_owner(self):
        return self.__owner

    def set_name(self,newName):
        self.__name= newName
        return

    def get_name(self):
        return self.__name

    def noise(self):
        print('errr')
        return

    def __hiddenmethod(self):
        print("hard to find")

def main():
    dog = Animal()    
    dog.set_owner('Sue')
    print dog.get_owner()
    dog.noise()


if  __name__ =='__main__':main()

答案 5 :(得分:0)

您定义的主要功能看起来像是在Animal类中。 Main应该是动物类之外的函数(类包含方法)。您还应该让您的类继承自对象,即

类Animal(对象):