python - 无法在包中导入类
问题描述
我有以下项目结构: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 BaseObject
moduleb.py
在这种情况下进行进口的正确方法是什么?
解决方案
您有一个循环导入 - 基础导入 modulea 导入 moduleb 导入 base。Python 不支持循环导入,因此它在技术上无法工作,即使对于技术上支持它们的语言,循环依赖也是一件非常糟糕的事情。
您的解决方案是在同一个模块中重新组合相互依赖的对象(类、函数等) - 请注意 Python 不是 Java 并且不需要“每个类一个模块”(它甚至实际上是 Python 中的反模式) - 或者移动DefaultObject
到它自己的模块。
推荐阅读
- .htaccess - htaccess 中的强制 SSL 仅转到主页
- javascript - 在 IE8 上使用 Vivid.JS 库
- javascript - JS Fetch 只接受 OPTIONS 请求并将其打印出来
- sql - 使用连接转换内联查询
- php - laravel artisan 工具生成mvc结构
- java - 如何预填充我的 Room 数据库?
- python - Django - python中'super'关键字的用途是什么?
- php - FosUserBundle:找不到与“AppBundle\Entity\User”类实体关联的对象管理器
- html - 角度 6 的 SVG 超链接问题
- c++ - 创建指向文件状态的指针并读入