# 包的结构与使用

URL: https://caijiao.org/python/ch06/packages
Source: docs/python/ch06/packages.md
Description: 本章讲解 Python 中包的基本概念、结构、创建与导入方法，帮助读者构建模块化的项目结构，实现代码的高效组织与复用。

包（Package）是 Python 中用于组织模块的目录结构，允许开发者将多个模块组织成逻辑上相关的集合。通过合理使用包，可以提升代码的可维护性与复用性。

## 什么是包

包是一个带有 `__init__.py` 文件的目录，其中可以包含多个模块或子包。包的存在使得 [Python](/python/) 支持模块的层级结构。

```

myproject/
├── main.py
└── mypackage/
├── **init**.py
├── module1.py
└── module2.py

```

## 创建包

1. 创建一个目录作为包名。
2. 在目录中添加一个空的 `__init__.py` 文件（在较新版本中不是强制，但仍推荐保留）。
3. 将相关模块文件放入该目录中。

## 导入包中的模块

可以通过以下方式导入包内模块：

```python
# 完整路径导入
from mypackage import module1
module1.hello()

# 或者导入具体函数
from mypackage.module1 import hello
hello()
```

## `__init__.py` 的作用

- 标识该目录为一个包；
- 可用于初始化包、定义快捷访问的函数或变量；
- 可以控制 `from mypackage import *` 时的导入行为。

**mypackage/**init**.py**

```python
print("mypackage 已被导入")
```

## 子包与嵌套包

包可以包含子包，形成多层嵌套结构：

```
mypackage/
  ├── __init__.py
  └── subpackage/
      ├── __init__.py
      └── utils.py
```

导入方式：

```python
from mypackage.subpackage import utils
```

## 相对导入与绝对导入

- 绝对导入：使用完整路径 `from mypackage.module1 import hello`
- 相对导入：在包内部使用 `from .module1 import hello`（点表示当前目录）

## 包的发布与使用

自定义包可通过以下方式进行发布与分发：

1. 使用 `setup.py` 定义安装信息；
2. 发布到 PyPI 或通过 `pip install .` 安装本地包；
3. 在其他项目中使用 `import` 引入。

## 总结

- 包是 Python 项目组织的重要结构单元；
- 使用 `__init__.py` 文件来控制包的行为；
- 子包支持模块的进一步划分，利于大型项目管理；
- 理解包的导入方式有助于构建可维护的工程代码。
