# 7.0包、模块、函数与变量作用域

## 什么是包？

```
物理表现上包就是一个文件夹，和文件夹的唯一区别为:包是一个包含“__init__.py”模块的文件夹
```

> 包的命名规则：后期补充
>
> `__init__.py`文件说明：
>
> 一般模块的命名空间为packag&#x65;_&#x6E;ame.modulename，\`\_\_init_.py\`模块的命名空间不需要package\_name.modele\_name，而直接使用package\_name表示
>
> 当包导入时，python将自动执行`__init__.py`文件(其实任意模块被导入，模块内的代码都将被自动执行)
>
> `__init__.py`文件常用于包和模块的初始化 ，以及做共享导入

## 什么是模块？

一个.py文件即被称为一个模块

> 模块的命名规则后期补充

## 包、模块、类三者关系

```
一个包下可以包含多个模块，一个模块可以包含多个类
```

## 模块之间如何引用？

包和模块不会重复导入

导入包时应避免循环导入，否则会报错

一个模块被导入，该模块里的代码会自动执行，即使里面的方法并没用被手动调用

import导入：只能用于导入模块

案例一：导入同级模块

```python
import module_name

print(modelu_name.variable_name)
```

案例二：导入同级的子包下的模块

```python
import packege_name.module_name

print(packege_name.module_name.variable_name)
```

案例三：导入同级子包下的模块并赋予命名空间（即模块路径：package\_name.module\_name）别名

```python
import package_name.module_name as alis_name
print(alis_name.variable_name)
```

from import 方式：支持导入模块、变量、方法

案例一：导入模块

```python
from package_name import module_name
```

案例二：导入变量

```python
from module_name import variable_name
```

案例三：导入多个变量

```python
from module_name import variable1_name,variable2_name,variable3_name
```

> python希望一行代码不超过80字符，当import语句一行代码超过80字符可采用如下方式换行
>
> 方式一：使用\\
>
> ```python
> from modele_name import a,b,\
> c
> ```
>
> 方式二：使用()
>
> ```python
> from module_name import (a,b,
> c)
> ```

案例四：导入被导入模块中所有暴露的变量

```python
from module_name import *
```

> 建议尽量少使用这个大而全的导入方式

案例五：共享导入

```python
# __init__.py
import sys
import datetime
import io
```

```python
# package_name中已导入sys、datetime、io三个模块，故该模块不需要导入这三个模块仍可以使用sys、datetime、io模块
import package_name

print(package_name.sys.path)
```

## 限制导出

模块限制可导出的变量：在模块里添加如下代码

```python
# 模块下的variable1_name、variable2_name可被导出，其他变量不可被导出
__all__=['variable1_name','variable2_name']
```

包限制可导出的模块：在包下的`__init__.py`模块下添加如下代码

```python
# 包下的modele1_name可被导出，其他模块不可被导出
__all__=['module1_name']
```
