Python Day16:模块的定义、模块的导入、二次导入、循环导入问题

## 内容

```python
1,模块:模块定义
2,导入方式:import|from ···import···
    名称空间    |绝对导入|起别名   *****
3,环境变量:sys.path      *****
4,导入模块的顺序
5,循环导入:模块间相互导入    *****
```

## 模块

```python
常见四种模块:
1.使用python编写的.py文件
2.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
3.使用C编写并链接到python解释器的内置模块
4.已被编译为共享库或DLL的C或C++扩展

什么是模块:一系列功能的集合体
为什么有模块:很多相似的功能要统一管理,将这些功能放在一个文件                中,该文件就是管理这些功能的集合体,即模块
怎么使用模块:在要使用模块的文件导入模块:import 模块名(管理一系列功能的集合的文件)
在哪使用模块:在所有要使用模块中功能的文件中导入并使用该模块

```

## 导入模块的内部执行步骤

```python
首次导入:
1,将被导入的模块编译形成对应的pyc文件
2,进入模块,从上往下顺序执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中
3,在使用模块的文件中,产生一个与模块名(文件名)同名的名字,指向模块的全局名称空间
再次导入:
1,不再执行首次导入的前两步,只走第三步,:在当前模块中产生一个名字,指向导入在内存中产生的全局名称空间。(再次导入没有任何变化!)

起别名:import 模块名 as 别名
    导入一旦起别名,原模块名对象失效,本质只产生了别名对象指向模    块文件的全局名称空间

```



## 模块的分类

```python
内置(built-in)|自定义(系统提供)|第三方提供|自己自定义
```

## 模块的加载顺序

```python
内存=>内置=>sys.path(安装环境变量中路径的先后顺序逐一加载)
为什么有加载顺序:导入的模块重名的话,通过优先加载机制,避免冲突
```

## 环境变量

```python
环境变量:本质上就是存放路径的list,第一位默认是当前执行文件所在路径
import sys
sys.path 就是环境变量  ,属于内置模块。
清空环境变量:所有导入都不能使用了:sys.path.clear()
添加指定路径到环境变量:sys.path.append()
                    sys.path.insert()
```

from···import···语法导入

```python
导入内部执行三步骤:
1,将被导入的模块编译成对应的pyc文件
2,进入模块,从上往下顺序执行模块代码,将所产生的名字存放在该模块文件的全局名称空间中
3,在导入模块的文件中形成一个或多个名字指向模块全局名称空间中的一    个或多个具体名字
from 模块名 import 模块中的具体名字(对象)
from 模块名 import 名字(对象) as 别名
```

## from····import *

```python
导入星号 *:模块中默认通过__all__导入*所代表的变量们,方法__all__是默认添加到模块中的。__all__默认不会纳入下划线“_”开头的名字,所以通过  from ```import*无法将_开头的名字导入。
__all__是可以自定义的,通过自定义可以将下划线_开头的名字导入:
__all__=["a","b","d_","_e"]:此时from···import*可以将_e导入。
```

## 链式导入

```python
t1导入m1,m1导入m2,m2导入m3
执行流程:运行t1,在t1导入m1模块的地方进入m1,去执行m1,同理在m1执行过程中遇到导入m2,会马上进入名m2,去执行m2,一直到m3,m3执行完毕,回到m2中,接着往下执行m2,m2执行完毕,回到m1,直到t1

执行过程中,遇到任何模块的二次导入,都是直接引用内存中的名称空间,不会再次进入模块。

```



## 循环导入

```python
循环导入的问题点:名字还没有产生,就使用名字
解决循环导入:先产生名字,再导入模块
            将会产生循环导入的模块,导入语法延后——延后导入
问题例子:
#m1.py文件下:
import m2
print(m2,y)
x=666
#m2文件下:
import m1
print(m1,x)
y=888

解决方案:
#m1.py文件下
x=666
import m2
print(m2,y)
#m2.py文件下
y=888
import m1
print(m1,x)
```
原文地址:https://www.cnblogs.com/huhongpeng/p/10922640.html