我有以下代码,它有以下两个问题:
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()
答案 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文件并在其中执行它们。当解释器遇到类定义时,它会执行以下操作:
那么当您在代码中缩进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(对象):