1

我正在努力完成出色的“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

这在今天的其他简单类中反复发生。有人可以告诉我我做错了什么吗?

4

3 回答 3

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文件中的所有其他内容并将其导入。

于 2012-09-10T14:32:18.387 回答
5

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

thing = mystuff.MyStuff()

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

from mystuff import MyStuff
于 2012-09-10T14:33:18.977 回答
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()

于 2012-09-10T14:50:15.460 回答