使用命令行Python无法解释的NameError

时间:2012-09-10 14:31:30

标签: python oop

我正在努力完成优秀的'Python The Hard Way'并将以下代码复制到名为mystuff.py的文件中:

class MyStuff(object):

    def __init__(self):
        self.tangerine = "And now a thousand years between"

    def apple(self):
        print "I AM CLASSY APPLES!"

在终端:

import mystuff

thing = MyStuff()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'MyStuff' is not defined

今天,其他简单的课程一再发生这种情况。有人能告诉我我做错了吗?

3 个答案:

答案 0 :(得分:7)

您可能需要thing = mystuff.MyStuff()(假设mystuff是类MyStuff所在的文件的名称。)

这里的问题是python如何处理命名空间。您通过导入将某些内容添加到当前命名空间中,但是将命名空间从一个文件合并到另一个文件的方式有很大的灵活性。例如,

import mystuff

将mystuff(模块/文件级别)命名空间中的所有内容添加到当前命名空间中,但要访问它,您需要mystuff.function_or_class_or_data。如果您不想一直输入mystuff,可以在当前模块(文件)中更改用于引用它的名称:

import mystuff as ms

现在,您可以通过以下方式访问MyStuff

thing = ms.MyStuff()

而且(差不多)最后,还有from mystuff import MyStuff。在此表单中,您将MyStuff直接带入您的命名空间,但mystuff中的任何其他内容都不会进入您的命名空间。

最后,(不推荐这个)from mystuff import *。这与前一个相同,但它也会抓取mystuff文件中的所有其他内容并导入它。

答案 1 :(得分:5)

您正在将模块导入到本地命名空间,而不是类。如果要将该类与当前导入一起使用,则需要:

thing = mystuff.MyStuff()

如果您想使用您拥有的声明,您需要:

from mystuff import MyStuff

答案 2 :(得分:0)

好吧,我想你得到了你需要的东西。但是这里发生了什么呢

import mystuff 

#with this type of import all the names in the `mystuff` module's namespace are not copied into current modules namespace.

所以你需要使用mystuff.MyStuff()

使用from mystuff import *mystuff模块命名空间中的名称复制到当前模块的名称空间。现在可以直接使用thing=MyStuff()