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 个回答
2
这个结构在你大部分代码中都是值得拥有的,特别是当你在多个环境中运行时。
if __name__ =='__main__':
main()
27
要理解你写的代码为什么失败,你需要知道一点关于Python中类定义是怎么回事。你可能知道,Python是一种解释型语言:有一个程序会读取Python文件,并逐行执行。当解释器遇到类定义时,它会做以下几件事:
- 创建一个新的命名空间(就是一个记录所有变量名称的地方),用来存放类的变量和方法。
- 提取类定义中的所有代码(根据缩进来判断),并执行这些代码。这会填充刚刚创建的命名空间。
- 创建一个新的类对象,这个对象的命名空间就是上面提到的,并且有定义中给出的基类。
- 将类的名称绑定到这个对象上。
那么,当你把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()