Python导入报错AttributeError: module 'mod.what' has no attribute 'yo'求解
报错原因
- Python导入包时不会自动递归加载所有下级子模块。执行
from mod import what时仅加载了mod/what/__init__.py对应的包对象,yo.py作为what包下的子模块未被显式导入时,不会自动成为what包的可访问属性,因此访问what.yo会抛出AttributeError。 - 之前可以正常运行的
from mod.what import yo写法是直接指定加载yo子模块,因此可以正常访问模块内的类。
解决方案
要实现what.yo.Yo这种层级访问形式,只需要在对应包的__init__.py中显式导入需要对外暴露的子模块或类即可,无需在业务代码中逐个导入冗余子模块:
- 编辑
mod/what/__init__.py,添加如下代码将yo模块暴露到what包的命名空间:
from . import yo # 如果需要更短的访问路径,直接把Yo类暴露到what包下,可额外添加这行,后续即可直接用what.Yo访问类 # from .yo import Yo
- 如果有更深层级的模块需要暴露,遵循相同逻辑在对应层级的
__init__.py中导入即可。比如需要mod包直接暴露what模块,可在mod/__init__.py中添加from . import what。
这种方案仅需在包配置文件中统一维护对外暴露的内容,即可满足通过包层级路径直接访问下层类的需求。
内容的提问来源于stack exchange,提问作者Pavel Komarov
相关产品推荐
相关产品推荐

