You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python模块导入疑问:调用子模块方法是否需直接导入子模块?

Python子模块导入的常见疑问解答

这是个非常典型的Python模块导入问题,我来给你掰扯清楚——你遇到的情况是Python的通用行为,不是你的代码有问题哦!

核心原理:Python的懒加载导入机制

当你执行import foo时,Python只会完成这两件事:

  1. 加载并执行foo/__init__.py文件(如果该文件存在的话);
  2. 将foo这个模块对象引入当前命名空间。

但它不会自动去加载foo的子模块(比如foo.bar),除非你在foo/__init__.py里主动写了导入子模块的代码。这就是为什么你直接import foo后调用foo.bar.my_method()会报错——此时foo对象里根本没有bar这个属性!

两种解决方式

方式1:显式导入子模块

这是最直接也最推荐的做法,就是你已经测试过的:

import foo.bar
# 或者用 from 语法:from foo import bar

# 之后就能正常调用
foo.bar.my_method()
# 或者 bar.my_method()

显式导入子模块会告诉Python去加载foo/bar.py(或者foo/bar/__init__.py),并把bar模块挂载到foo对象下。

方式2:在父模块的__init__.py中预导入子模块

如果你希望别人只需要import foo就能直接用foo.bar,可以在foo/__init__.py里添加一行导入代码:

# foo/__init__.py
from . import bar  # 或者 import foo.bar

这样当任何人执行import foo时,__init__.py里的代码会自动执行,把bar子模块加载并挂载到foo上,之后就可以直接调用foo.bar.my_method()了。

总结

  • 父模块的默认导入不会包含子模块,这是Python导入机制的设计,不是bug;
  • 要么显式导入子模块,要么在父模块的__init__.py中预导入,二选一就能解决你遇到的报错问题。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:33:13