每当我从Person类创建实例/对象时,我都会收到NameError
我创建了一个另存为Person.py的类 在终端上,我已经使用“ python -i”导入了所有内容 我输入了P1 = Person(“ name”,“ name”,20) 但是我遇到了以下错误
python -i
Python 2.7.15+ (default, Nov 27 2018, 23:36:35)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> p1=Person("i","j",20)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Person' is not defined
代码:
class Person:
#constructor
def __init__(self,first_name,last_name,age):
self.first_name = first_name
self.last_name = last_name
self.age = age
#set first_name
def setFirst_name(self,first_name):
self.first_name = first_name
#get first_name
def getFirst_name(self):
return self.first_name
#set last_name
def setLast_name(self,last_name):
self.last_name = last_name
#get last_name
def getLast_name(self):
return self.last_name
#set age
def setAge(self,age):
self.age = age
#get age
def getAge(self):
return self.age
#get full_name
def getFull_name(self):
return self.first_name + " " + self.last_name
#get details
def getDetails(self):
details = {'First Name':self.first_name,'Last Name':self.last_name,'Age':self.age}
我希望P1创建一个Person对象,以便在我调用函数'getDetails()'时应打印以下内容
名字:i姓氏:j年龄:20
答案 0 :(得分:3)
您必须先导入本地文件,然后才能使用它-即使该文件位于同一目录中。这应该起作用:
>>> import Person
但是现在Person
代表文件Person.py
的内容。要真正进入Person
类,您需要显式调用它:
>>> p1 = Person.Person("i", "j", 20)
您可以通过从文件 Person
导入 class Person.py
来解决此问题:
>>> from Persion import Person
>>> p1 = Person("i", "j", 20)
答案 1 :(得分:0)
因此,您只是在您编写的Person.py
文件所在的工作目录中运行python shell吗?
这还不足以告诉Shell / Python您要使用该文件的内容。必须明确导入该shell实例中尚未定义的所有内容。 (大写正确)
如果您直接使用-i
在shell上工作,则必须包含后面的参数。这些就是您想要的文件名,因此您的完整行将为python -i "Person.py"
。
但是如果将来您想使用脚本,那么这是不可能的,您需要在正在使用的“主”文件中指定 imports ,并要求其他要调用的文件。 例如
#import ModuleName
# in this case your "module" is the "Person.py" file so:
import Person
这将允许您使用正在使用的Shell /脚本中的“模块” /文件的内容。要使用该模块内部的Class
,也称为“ Person” ”,则需要像Person.Person(args)
当然,看这些多余的文字会很烦人,因此我们可以通过这样具体地导入 该类来清理它:
#from Module import Class
from Person import Person
# now we can just use Person(args) without having to specify the Person module every time
为了以后的参考,我假设您正在学习类:
如果在单个模块/文件中有多个类,则说您添加了一个Animal
类,那么您可以一个一个地导入它们,也可以一次用星号将它们全部导入,如下所示:
#either
from Person import Person, Animal
#or
from Person import *