即使是空的 __init__.py,它依然有两个核心作用,对于你(特别是做工程化开发)非常重要。
1. 把它变成"常规包" (Regular Package)
如果你不加 __init__.py,Python 3 会把这个目录当作 Namespace Package(命名空间包)。
- Namespace Package 是个高级特性,允许一个包分布在硬盘的多个不同目录下(比如
plugin/文件夹一部分在 C 盘,一部分在 D 盘)。 - 对于我们这种普通的项目,你需要的是 Regular Package 。加上
__init__.py,Python 扫描 import 时效率更高,而且行为更符合直觉。
2. 控制 from package import * 的行为 (重点)
这是 __init__.py 最实用的功能:对外暴露接口。
假设你的目录结构是这样:
text
strategies/
├── __init__.py
├── rsi_strategy.py <-- 里面有个 class RSIStrategy
└── ma_strategy.py <-- 里面有个 class MAStrategy
如果 __init__.py 是空的:
你想在 main.py 里用这两个策略,你得写得很长:
python
from strategies.rsi_strategy import RSIStrategy
from strategies.ma_strategy import MAStrategy
(如果文件名很长,这会写得很烦)
如果你在 __init__.py 里写了东西:
你可以在 strategies/__init__.py 里写:
python
# strategies/__init__.py
from .rsi_strategy import RSIStrategy
from .ma_strategy import MAStrategy
现在,你在 main.py 里就可以这样写了:
python
# 变得非常简洁!
from strategies import RSIStrategy, MAStrategy
这就是所谓的 "提升命名空间"。你把深层文件里的类,提到了包的顶层,让使用者(也就是你自己)调用起来更爽。
总结
虽然 Python 3 不强制要求,但请务必保留 __init__.py,哪怕是空的。 因为它标志着:"这是一个完整的、独立的 Python 源代码包",这对于代码规范和 IDE 的智能提示都非常重要。