Python中的主方法

8 投票
6 回答
76952 浏览
提问于 2025-04-17 09:57

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

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 个回答

2

这个结构在你大部分代码中都是值得拥有的,特别是当你在多个环境中运行时。

if  __name__ =='__main__':
    main()
27

要理解你写的代码为什么失败,你需要知道一点关于Python中类定义是怎么回事。你可能知道,Python是一种解释型语言:有一个程序会读取Python文件,并逐行执行。当解释器遇到类定义时,它会做以下几件事:

  1. 创建一个新的命名空间(就是一个记录所有变量名称的地方),用来存放类的变量和方法。
  2. 提取类定义中的所有代码(根据缩进来判断),并执行这些代码。这会填充刚刚创建的命名空间。
  3. 创建一个新的类对象,这个对象的命名空间就是上面提到的,并且有定义中给出的基类。
  4. 将类的名称绑定到这个对象上。

那么,当你把main函数缩进到代码内部时发生了什么呢?在第二步中,你提到了名称Animal。但是这个名称直到第四步才被定义!实际上,在你提到它的时候,它不能被定义,因为那样会形成循环。当你把main放到类定义外面时,它不会在完成第一到第四步之前执行,因此名称Animal会已经被绑定。


顺便说一下,你写的代码并不是好的Python代码。你可能需要找一个更好的教程;通常推荐的是《Dive Into 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()
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()

撰写回答