# 基于模块化编程

代码模块化是进行大型项目的必经之路，通过将代码进行模块化、解耦将功能进行模块化。在C语言中通过`include`语法，将不同模块的头文件进行重复利用；在javascript中使用`module export||require`语法实现模块的引入。同样在python中也可以引入自定义模块，简化代码。

![python模块化](https://pypi.org/static/images/logo-large.svg)

## 1.定义模块

模块文件实际上就是一个`python`脚本，脚本中可以向外部提供变量、函数、类等数据结构

```bash
## 模块文件readHomolog.py
def readHomologous(fileName,sep,columnId1,columnId2):
   HomologDict={}
if __name__ == "__main__": #调试模块时才会运行
    pass
```

## 2.组织模块

当一个工程之中包含有多个模块，并且模块之间具有一定的依赖关系；我们可以将这些模块组织起来形成一个packages。一个packages对应了一个工程所用到的模块，进而在python packa仓库发布。

* module1.py
* modlue2.py

> packages 目录中需要包含 **init**.py文件，说明当前目录为packages

```bash
## 目录结构
homolog
├── __init__.py
├── __pycache__  ##引入packages后自动创建
└── readHomolog.py
```

## 3.引入模块

### 3.1直接引入

当python可执行脚本与模块文件同属于一个父目录时，可以直接引入

例如`run.py`脚本与模块文件`readHomolog.py`同属于一个父目录，所以在`run.py`中直接import 即可。这里引入的是模块文件中自定义的函数

> from readHomolog import readHomologous

```bash
homolog
├── __init__.py
├── __pycache__  ##引入packages后自动创建
└── readHomolog.py
|__ run.py
```

## 3.2sys模块引入

使用`sys`模块，指定自定义模块所在目录，python能够自动进行搜索

```bash
#在run.py中
import sys
sys.path.append("模块所在绝对路径")
from readHomolog import readHomologous
```

## 3.3通过pth文件进行配置

在python的安装路径`\Python35\Lib\site-packages`中配置对应的pth文件，

pth文件格式

conda中python对应的路径为`~/anaconda3/lib/python3.6/site-packages`

> module\_模块名.pth

在脚本中直接引用即可

```bash
from readHomolog import readHomologous
```

## 参考

1. [模块引入](https://blog.csdn.net/weixin_34114823/article/details/92862081?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1\&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1)
2. [模块属性](https://blog.csdn.net/lengye7/article/details/90045498?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3\&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3)
3. [模块组织](https://blog.csdn.net/lengye7/article/details/90045498?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3\&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3)
