当前位置: 首页 > 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 包装类:实现智能整数操作》
  • 有域名和空间怎么做网站/软文广告的案例
  • 网站开发维护公司/网页制作代码大全
  • 丽水做企业网站的地方/潍坊百度网站排名
  • 云浮营销建站公司/海南百度推广开户
  • 设计一个校园网方案/牛排seo
  • 政务网站集约化建设推进情况/百度seo如何优化关键词