__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,然后在每一层做“统一出口”,让最外层可以简洁导入”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值