【问题标题】:How to fix the 'NameError' 'Person' not defined如何修复未定义的“NameError”“Person”
【发布时间】:2019-11-22 07:15:37
【问题描述】:

每当我从类 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

【问题讨论】:

  • 如果你在终端上运行它,你可能需要导入你的类:from Person import Person
  • 也许你想做python -i the_file_containing_Person.py 而不仅仅是python -i

标签: python


【解决方案1】:

您必须先导入本地文件才能使用它 - 即使该文件位于同一目录中。这应该有效:

>>> import Person

但是现在,Person 代表文件Person.py 的内容。要真正访问 Person 类,您需要显式调用它:

>>> p1 = Person.Person("i", "j", 20)

您可以通过从文件 Person.py 导入 Person 来解决这个问题:

>>> from Persion import Person
>>> p1 = Person("i", "j", 20)

【讨论】:

  • 或者他们可以做python -i Person.py。这将评估person.py 并立即启动与Person 类的交互式解释器会话。
【解决方案2】:

所以您只是在您编写的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

这将允许您从您正在使用的外壳/脚本中使用该“模块”/文件的内容。要使用该模块内的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 *

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多