导入类时为什么会出现Name Error?

时间:2010-10-07 19:16:51

标签: python

我刚刚开始学习Python,但我已经遇到了一些错误。我创建了一个名为pythontest.py的文件,其中包含以下内容:

class Fridge:
    """This class implements a fridge where ingredients can be added and removed individually
       or in groups"""
    def __init__(self, items={}):
        """Optionally pass in an initial dictionary of items"""
        if type(items) != type({}):
            raise TypeError("Fridge requires a dictionary but was given %s" % type(items))
        self.items = items
        return

我想在交互式终端中创建一个新的类实例,所以我在终端中运行以下命令: python3

>> import pythontest
>> f = Fridge()

我收到此错误:

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

交互式控制台无法找到我制作的课程。但导入成功。没有错误。

4 个答案:

答案 0 :(得分:7)

似乎没有人提到你可以做到

from pythontest import Fridge

这样,您现在可以直接在命名空间中调用Fridge(),而无需使用通配符

进行导入

答案 1 :(得分:4)

你需要这样做:

>>> import pythontest
>>> f = pythontest.Fridge()

奖励:你的代码写得更好:

def __init__(self, items=None):
    """Optionally pass in an initial dictionary of items"""
    if items is None:
         items = {}
    if not isinstance(items, dict):
        raise TypeError("Fridge requires a dictionary but was given %s" % type(items))
    self.items = items

答案 2 :(得分:2)

尝试

import pythontest
f=pythontest.Fridge()

当您import pythontest时,变量名pythontest被添加到全局命名空间,并且是对模块pythontest的引用。要访问pythontest命名空间中的对象,您必须在其名称前添加pythontest后跟句点。

import pythontest导入模块和访问模块内对象的首选方法。

from pythontest import *

应该(几乎)始终避免。我认为可以接受的唯一一次是在包{†__init__内设置变量,以及在交互式会话中工作时。应该避免from pythontest import *的原因之一是它很难知道变量的来源。这使得调试和维护代码更加困难。它也不协助模拟和单元测试。 import pythontestpythontest提供了自己的命名空间。正如Python的禅宗所说,“命名空间是一个很好的主意 - 让我们做更多的事情!”

答案 3 :(得分:0)

您应该导入名称,即

 import pythontest
 f= pythontest.Fridge()

,或者

from pythontest import *
f = Fridge()