首页 > 解决方案 > 无法在包中导入类

问题描述

我有以下项目结构:1

这是文件的内容:

# run.py
from module.submodule.base import DefaultObject

d = DefaultObject()


# module/sumbodule/base.py
from module.submodule.modulea import A

class BaseObject(object):
    pass

class DefaultObject(BaseObject):

    def return_something(self):
        return A()


# module/submodule/modulea.py
from module.submodule.moduleb import B

class A(object):

    def return_something(self):
        return B()


# module/submodule/moduleb.py
from module.submodule.base import BaseObject

class B(BaseObject):
    pass

当我尝试跑步时,python3 run.py我得到ImportError: cannot import name 'BaseObject

我不明白为什么我能够导入class B,但modulea.py我不能class BaseObjectmoduleb.py

在这种情况下进行进口的正确方法是什么?

标签: pythonpython-import

解决方案


您有一个循环导入 - 基础导入 modulea 导入 moduleb 导入 base。Python 不支持循环导入,因此它在技术上无法工作,即使对于技术上支持它们的语言,循环依赖也是一件非常糟糕的事情。

您的解决方案是在同一个模块中重新组合相互依赖的对象(类、函数等) - 请注意 Python 不是 Java 并且不需要“每个类一个模块”(它甚至实际上是 Python 中的反模式) - 或者移动DefaultObject到它自己的模块。


推荐阅读