
python 导入模块时仅执行一次模块代码,因此模块内直接创建的类实例是全局唯一的;但更推荐导入类后按需实例化,以提升可测试性、可维护性和依赖清晰度。
python 导入模块时仅执行一次模块代码,因此模块内直接创建的类实例是全局唯一的;但更推荐导入类后按需实例化,以提升可测试性、可维护性和依赖清晰度。
在 Python 中,import 机制并非简单地“复制粘贴”代码,而是一套受 sys.modules 缓存严格管控的运行时过程。当你编写如下 foo.py:
# foo.py
class Foo:
def __init__(self):
print("Foo instance created")
foo = Foo() # ⚠️ 模块级实例化
并从多个地方导入:
# bar.py from foo import foo as foo_bar # baz.py from foo import foo as foo_baz
首次导入(如运行 bar.py)时,Python 会:
- 执行 foo.py 全部顶层语句;
- 定义 Foo 类;
- 执行 foo = Foo() → 输出 "Foo instance created";
- 将整个模块对象(含 foo 实例)缓存至 sys.modules['foo']。
后续导入(如再运行 baz.py 或同一进程内再次 import foo)不会重新执行模块代码,而是直接复用 sys.modules 中已构建好的模块对象 —— 因此 foo_bar 和 foo_baz 指向的是同一个 Foo 实例(内存地址相同)。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
✅ 正确做法:导出类,按需实例化
# foo.py(推荐)
class Foo:
def __init__(self):
print("Foo instance created")
# bar.py from foo import Foo foo_bar = Foo() # 独立实例 # baz.py from foo import Foo foo_baz = Foo() # 另一独立实例
这样不仅避免了隐式单例带来的耦合和测试难题(例如无法为不同场景注入不同配置),还使依赖关系显式化、生命周期可控,并支持 unittest.mock 等工具进行精准打桩。
⚠️ 注意事项:
- 模块级实例适用于明确需要全局唯一、无状态或轻量共享资源的场景(如配置对象、日志器),但需谨慎评估线程安全与初始化时机;
- 若 Foo 构造需参数或存在副作用(如读文件、连数据库),模块级实例将丧失灵活性,且首次导入即触发副作用,违反“导入即安全”原则;
- 使用 from foo import foo 仍依赖模块缓存,但语义上不如 from foo import Foo; f = Foo() 清晰可读。
总结:Python 的导入机制保证模块只执行一次,因此模块内创建的实例天然全局唯一;但工程实践中,应优先导入类并在使用处实例化——这是符合 Python 哲学(显式优于隐式)、利于协作与测试的稳健选择。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










