Python 与_init__u;.py混淆,从子模块导入父模块中的类

Python 与_init__u;.py混淆,从子模块导入父模块中的类,python,initialization,package,Python,Initialization,Package,我在理解如何从子模块中导入父模块中的类时遇到了一点困难。我有以下目录结构: module/ __init__.py (1) common.py (containing testfunc and CommonClass) submod/ __init__.py (2) test.py (containing TestClass) 在(1)中,我有: from

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

   module/
      __init__.py        (1)
      common.py          (containing testfunc and CommonClass)
      submod/
         __init__.py     (2)
         test.py         (containing TestClass)
(1)
中,我有:

   from common import *
   from test import TestClass
所以我可以直接做:

   import module
   module.testfunc()
(2)
中,我有:

   from common import *
   from test import TestClass
因此,在
模块中
我可以:

   import submod
   class_inst = submod.TestClass()
现在在
TestClass
(包含在
test.py
中)中,我想使用
CommonClass
的一个实例,因此我尝试首先使用以下方法导入它:

   from ..common import *
这很好,但是当我尝试在
TestClass
中创建
CommonClass
的实例时:

   class TestClass(object):
       def __init__(self):
           self.inst = CommonClass()
我得到一个错误:

   NameError: global name 'CommonClass' is not defined
   ImportError: cannot import name CommonClass
类似地,如果我尝试改为从..common import CommonClass执行
,则会出现错误:

   NameError: global name 'CommonClass' is not defined
   ImportError: cannot import name CommonClass
据我所知,
CommonClass
应该在
test.py
中可见,所以我不确定为什么找不到它。我有一种感觉,
\uuu init\uuuu.py
的用法有些我不理解。有人能帮我指出我犯的任何明显错误吗?

我想说“循环进口”,但我不能准确指出。你所看到的恐惧很可能就是一种症状。通常,如果您导入一个模块,而该模块又导入了其他内容,并且导入链最终导入了启动所有导入的模块,那么您将得到一个ImportError


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

您是指
submod
您编写
引擎和
引擎的地方吗?是的–对不起,更新了问题:)一些经验法则以避免混淆:不要在
\uuuu init\uuuuuy.py
文件中放入任何内容,可能除了顶级文件。除了定义对象、工厂函数和常量数据,模块级代码不做任何事情。出现这些问题的原因是,在您使用模块时,模块可能未完全初始化或导入。谢谢您的建议。但是,我不确定如何更好地构造代码。我在
submod
中有一组类,它们都扮演着相似但略有不同的角色,我想在
module
中使用一个“common”类来执行共享部分。作为一种设计模式,这似乎不应该引起问题,但我愿意接受如何改进的建议。无论如何,理解上面的内容为什么不起作用也很有意思,因为我觉得这将帮助我更深入地理解
\uuu init\uuuuuuy.py
文件及其工作原理。好吧,这似乎是一个合理的诊断。我将
CommonClass
移动到
module.submod.utils
,看起来一切正常。我很想确切地了解上面错误的原因是什么,但是如果没有人能够提供进一步的见解,那么我会接受这个答案。谢谢在模块级或在
测试类中执行
from..common import*
。\uuu init\uuu
from..common import*
test.py
中调用(即模块级)