当前位置: 首页 > news >正文

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


相关文章:

  • openGauss关联列数据类型不一致引起谓词传递失败
  • fuse性能关键参数entry_timeout
  • python面试高频考点(深度学习大模型方向)
  • V8引擎源码编译踩坑实录
  • 如何在 Vue 项目中使用v - show和v - if指令,它们的原理、区别和适用场景是什么
  • jangow-01-1.0.1靶机攻略
  • QuecPython 外设接口之GPIO应用指南
  • java中的常量可以不用在声明的时候初始化,c中的必须在声明的时候初始化,可不可以这么理解?
  • HDMI(High-Definition Multimedia Interface)详解
  • 三分钟读懂微服务
  • UE4学习笔记 FPS游戏制作16 重构FppShooter和RoboteShooter 提出父类Shooter
  • HTML应用指南:利用POST请求获取城市肯德基门店位置信息
  • 【八股文】http怎么建立连接的
  • 破解云端依赖!如何通过Flowise搭建私有化的端到端AI开发环境
  • [250324] Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!| Wine 10.4 发布!
  • 上海瀛旻信息科技有限公司
  • 总结 Spring 中存储 Bean 的相关注解以及这些注解的用法.
  • python+requests接口自动化测试
  • git使用钩子文件出现错误
  • 《深入剖析 SmartInt 包装类:实现智能整数操作》
  • 从孔雀尾巴到蒙娜丽莎,一个鸟类学博士眼中的“美”
  • 发出“美利坚名存实亡”呼号的卡尼,将带领加拿大走向何方?
  • 发布亮眼一季度报后,东阿阿胶股价跌停:现金流隐忧引发争议
  • 打造全域消费场景,上海大世界百个演艺娱乐新物种待孵化
  • 10台核电新机组获核准,上海核电厂商独揽超500亿元订单
  • 遭遇大规模停电,西班牙内政部宣布进入国家紧急状态