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
中调用(即模块级)