__init__.py
init.py
当然可以~这里我给你举几个简单又常见的 __init__.py
使用例子,让你快速理解它在实际项目中怎么用、有什么好处。
✅ 示例1:最基础的空文件(只用来标记包)
my_package/
├── __init__.py
├── module_a.py
└── module_b.py
__init__.py
是空的。- 作用:告诉Python,“这是一个包,可以被import”。
使用:
from my_package import module_a
✅ 示例2:在 __init__.py
中导入模块
# my_package/__init__.py
from . import module_a
from . import module_b
使用:
import my_package
my_package.module_a.do_something()
✅ 示例3:直接暴露内部函数/类(简化导入路径)
# module_a.py
def add(x, y):
return x + y
# module_b.py
class Calculator:
def multiply(self, a, b):
return a * b
# __init__.py
from .module_a import add
from .module_b import Calculator
使用:
from my_package import add, Calculator
print(add(2, 3))
calc = Calculator()
print(calc.multiply(4, 5))
💡 好处:外部使用者不用知道内部结构,只关注接口。
✅ 示例4:添加初始化逻辑
# __init__.py
print("my_package 正在初始化...")
使用时:
import my_package
会自动输出:
my_package 正在初始化...
✔ 适合放日志、加载配置、注册模型等。
✅ 示例5:控制 from my_package import *
时的导入内容
# __init__.py
from .module_a import add
from .module_b import Calculator
__all__ = ["add"] # 只导出 add,Calculator 不会被导入
使用:
from my_package import *
add(1, 2) # ✅ 可以用
Calculator() # ❌ 报错
如果你以后做一个深度学习项目,把模型结构拆分成 backbone/ head/ utils/ config/
几个模块,合理写 __init__.py
会极大提高代码可读性和可维护性。
很好,你现在问的是 “包里套包” 的结构,也就是 多级Python包结构(nested packages),这在大一点的工程项目里非常常见,比如 models/backbone/resnet.py
这样的结构。
包里套包就是目录嵌套结构
✅ 一句话解释:
包里套包就是目录嵌套结构,每一层目录都要包含一个
__init__.py
,这样才能被Python识别为包。
✅ 举个典型例子:
my_project/
├── models/
│ ├── __init__.py
│ └── backbone/
│ ├── __init__.py
│ └── resnet.py
resnet.py
中:
class ResNet:
def forward(self, x):
pass
models/backbone/__init__.py
中:
from .resnet import ResNet
models/__init__.py
中:
from .backbone import ResNet
在主程序 main.py
中就可以这样用:
from models import ResNet
model = ResNet()
✅ 套包结构的好处:
好处 | 举例 |
---|---|
清晰分层 | 比如 models/backbone、models/head 区分网络结构 |
方便管理大型项目 | 多模块、多人开发时模块更清晰 |
灵活导入 | 可以 from models.backbone.resnet import ResNet 或更简 from models import ResNet |
📌 提醒:
- 每一层目录都必须有
__init__.py
,哪怕它是空的; - 如果你希望 暴露更简洁的导入路径,就要在
__init__.py
中做好“封装/跳转”。
✅ 再举一个复杂点的真实例子(行为识别项目):
driver_behavior/
├── __init__.py
├── models/
│ ├── __init__.py
│ ├── backbone/
│ │ ├── __init__.py
│ │ ├── resnet.py
│ │ └── mobilenet.py
│ ├── head/
│ │ ├── __init__.py
│ │ └── classifier.py
│ └── model_builder.py
使用方式:
# 主程序
from models import ResNet, MobileNet, ClassifierHead
通过:
# models/backbone/__init__.py
from .resnet import ResNet
from .mobilenet import MobileNet
# models/head/__init__.py
from .classifier import ClassifierHead
# models/__init__.py
from .backbone import ResNet, MobileNet
from .head import ClassifierHead
✅ 总结一句话:
包里套包结构核心就是“每层都加 init.py,然后在每一层做“统一出口”,让最外层可以简洁导入”。