Bootstrap

【python项目代码结构】第一章:为什么每个包里都有_init_.py

_init_.py的重要之处

我在GitHub上找代码的时候,发现几乎每个包里面都有_init_.py文件。我便好奇这个包的作用。
具体作用如下:

1. 标识目录为 Python 包

__init__.py 文件的主要作用是告诉 Python 这个目录应该被视为一个包。没有 __init__.py 文件的目录不会被 Python 解释器识别为包。这意味着你可以在这些目录中进行模块的导入。

例如:

from lib import data
from scripts import train

2. 包初始化

__init__.py 文件可以包含包的初始化代码。这意味着你可以在 __init__.py 文件中执行一些包的初始化操作,如导入子模块、设置包级别的变量等。

例如,假设你有一个 lib 包,其中包含多个模块,你可以在 lib/__init__.py 中导入这些模块,使它们在导入 lib 包时自动可用:

# lib/__init__.py
from .data import *
from .model import *
from .metrics import *

这样,当你导入 lib 包时,lib 中的所有模块都会被自动导入:

import lib

df = lib.load_data('data.csv')
model = lib.Model()

3. 控制包的公开接口

你可以在 __init__.py 文件中定义 __all__ 列表,以显式声明包的公共接口。这有助于控制从包中导入的内容。

例如:

# lib/__init__.py
from .data import load_data, preprocess_data
from .model import Model
from .metrics import evaluate_model

__all__ = ['load_data', 'preprocess_data', 'Model', 'evaluate_model']

这样,当使用 from lib import * 时,只会导入__all__ 列表中指定的对象:

from lib import *

df = load_data('data.csv')  # 有效
model = Model()  # 有效
# preprocess_data 和 evaluate_model 也可以使用

示例

以下是一个项目结构示例,其中包含 init.py 文件:

project/
├── lib/
│   ├── __init__.py      # 标识 lib 目录为一个包,并导入子模块
│   ├── data.py          # 数据处理相关的函数和类
│   ├── model.py         # 模型定义和训练相关的函数和类
│   ├── metrics.py       # 评估指标相关的函数
│   └── util.py          # 其他实用工具函数
├── scripts/
│   ├── __init__.py      # 标识 scripts 目录为一个包
│   ├── train.py         # 模型训练脚本
│   ├── evaluate.py      # 模型评估脚本
│   └── predict.py       # 模型预测脚本
└── README.md            # 项目说明文件

总结

  • 标识包:__init__.py 文件告诉 Python 目录是一个包,使你能够导入和使用目录中的模块。
  • 初始化代码:可以包含初始化代码,设置包级别的变量或导入子模块。
  • 控制接口:可以通过 __all__ 控制从包中导入的内容。

通过这些方式,__init__.py 文件在组织和管理 Python 项目代码时起到了重要作用。

在这里插入图片描述

;