与__init__.py混淆并从子模块导入父模块中的类

时间:2012-11-15 12:15:46

标签: python initialization package

我在理解如何从子模块中从父模块导入类时遇到一些困难。我有以下目录结构:

   module/
      __init__.py        (1)
      common.py          (containing testfunc and CommonClass)
      submod/
         __init__.py     (2)
         test.py         (containing TestClass)

(1)我有:

   from common import *

所以我可以直接做:

   import module
   module.testfunc()

(2)我有:

   from test import TestClass

所以我可以在module内完成:

   import submod
   class_inst = submod.TestClass()

现在在TestClass(包含在test.py中)我想使用CommonClass的实例,所以我尝试先使用以下方法导入它:

   from ..common import *

哪种方法正常,但当我尝试在CommonClass中创建TestClass的实例时:

   class TestClass(object):
       def __init__(self):
           self.inst = CommonClass()

我收到错误:

   NameError: global name 'CommonClass' is not defined

同样,如果我尝试from ..common import CommonClass,我会收到错误:

   ImportError: cannot import name CommonClass

据我所知,CommonClass应该在test.py内可见,所以我不确定为什么找不到它。我有一种感觉,我对__init__.py的用法有所了解。是否有人可以指出我正在制造的任何明显错误?

1 个答案:

答案 0 :(得分:1)

我想说“循环进口”但我无法确定它。你看到的ImportError可能就是这种情况的症状。通常,如果您导入的模块又导入了其他内容,并且导入链最终导入了启动所有导入的模块,那么您将获得ImportError。

您可以将CommonClass移动到新模块module.submod.utils中,该模块不会从您的代码中导入任何其他内容并从那里导入吗?