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

Mik*_*ard 1 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!"
Run Code Online (Sandbox Code Playgroud)

在终端:

import mystuff

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

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

mgi*_*son 7

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

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

import mystuff
Run Code Online (Sandbox Code Playgroud)

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

import mystuff as ms
Run Code Online (Sandbox Code Playgroud)

现在,你可以MyStuff通过:

thing = ms.MyStuff()
Run Code Online (Sandbox Code Playgroud)

而且(差不多)最后,还有from mystuff import MyStuff.在这种形式中,您可以MyStuff直接进入命名空间,但其他任何内容都不会mystuff进入您的命名空间.

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


Sil*_*Ray 5

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

thing = mystuff.MyStuff()
Run Code Online (Sandbox Code Playgroud)

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

from mystuff import MyStuff
Run Code Online (Sandbox Code Playgroud)