1.内容大纲
- 模块的定义与分类
- import
- from ... import ...
- from ... import *
- py文件的两个功能
- 模块的搜索路径
2.具体内容
-
模块的定义与分类
-
什么是模块
- 一个模块就是一个py文件,这个模块存储很多相似的功能
-
模块的分类
- 内置模块,标准库,python解释器自带的,time,os,sys等等200多种
- 第三方库(模块)通过pip install 安装,6000多种
- 自定义模块,自己写的模块
-
模块的运行方式(py文件)
- 脚本方式:直接用解释器执行
- 模块方式:被其他的模块倒入,为导入他的模块提供资源
-
__name__
属性的使用- 在脚本方式运行时,
__name__
是固定的字符串:__main__
- 在以模块导入时,
__name__
就是本模块的名字 - 在自定义模块中对
__name__
进行判断,决定是否执行可执行语句,开发阶段就执行,使用阶段就不执行
if __name__ == '__main__': (要执行的函数)
- 在脚本方式运行时,
-
-
import
-
当引用模块的时候,实际上将该模块执行了一遍,加载到内存(只有在第一次引用的时侯,才将此模块加载到内存)
-
第一次导入模块发生的三件事
- 将导入的模块(如:tb)加载到内存
- 在内存中创建以tb命名的名称空间
- 通过(tb.)的方式引用此模块的名字(变量,函数名,类名)
-
被导入模块有独立的名称空间
- (坑)通过tb.的方式引用此模块的名字,一定是从此模块中寻找的
-
为模块起别名
import contextlib as cb
-
导入多个模块
import time,os,sys #不推荐 import time import os import sys
-
-
from ... import ...
from tb import name #相当于从tb模块的全局空间中将name,变量与值的对应关系复制到了当前执行文#件的全局名称空间中
- 优点:使用方便
- 缺点:容易产生覆盖效果
- 导入多个名字(同import)
- 起别名(同import)
-
from ... import * (控制成员被导入)
-
from tb import *
- 将tb模块的所有名字复制过来
- 容易覆盖
-
与
__all__
配合使用__all__
是一个列表,用于表示本模块可以被外届使用的成员,元素是成员名放入字符串__all__
只对from xxx import * 这种导入生效
__all__ = ['name', 'read1', 'read2']#被引用模块开头
-
-
import xxx 与from xxx import *的区别
-
import在使用其中成员时,必须使用模块名作为前缀;不容易产生冲突
-
from... 在使用其中成员时,不用使用模块名作为前缀,直接使用成员名即可;但容易产生命名冲突。后面定义的同名成员把前面的覆盖了
-
解决名称冲突的问题
- 改用import这种方式
- 自己避免使用同名
- 使用别名解决冲突
-
-
模块的搜索路径
- 寻找模块的路径:内存 --> 内置函数 --> sys.path
- 引用在,内存、 内置模块 、sys.path中无法找到的模块
import sys sys.path.append(r'模块路径')