模块化
Python中只有一种模块对象类型
模块module,指的是Python源代码文件
包package,指的是模块组织在一起的包和包同名的目录及其相关文件
模块的四种形式
- 内置模块:Python解释器自带的模块
- pip安装的模块:pip install 模块名
- 自定义模块:自定义模块
- 包
导入语句
导入非顶级模块,只将其顶级模块名称加入到本地名词空间中.导入的模块必须使用完全限定名称来访问.
如果使用as ,as 后的名称直接绑定到导入的模块对象,并将该名称加入到本地名词空间中.
- 找到from 子句中指定的模块,加载并初始化(不是导入)
- 对于import子句后的名称
- 先查from子句导入的模块是否具有该名称的属性
- 如果内有,则尝试导入该名称子模块中的同名模块
- 还没找到,抛出Import Error异常
- 之歌名称保存到本地名词空间中,如果使用了as语句,则使用as子句后面的名称
自定义模块
-
模块名就是文件名
-
模块名必须符合标识符要求
-
不要使用系统模块名,避免冲突
-
通常模块名全小写,下划线分割
模块搜索顺序
从当前-->局部-->全局-->内置
-
程序主目录,程序运行的主程序脚本所在的目录
-
PYTHONPATH目录,环境变量PYTHONPATH设置的目录也是搜索模块的路径
-
标准库目录,Pythoon自带的库模块所在的目录
模块运行
import time
#1. 开辟内存空间,内存空间命名为time
# 2. 把time.py中的所有代码读入名称空间,然后运行
# 3. 通过time.方法名使用time模块中的方法
优点:永不冲突
缺点:导入麻烦
from time import sleep
# 1. 开辟内存空间,内存空间命名为time
# 2. 把time.py中的所有代码读入名称空间,然后运行
# 3. 把sleep()读入import和from...import.py中,因此可以直接使用方法名
from time import * #表示导入time下所有方法
优点:调用省事
缺点:容易发生冲突
if __name__ == '__main__':
上语句常用于模块中功能检测,
其中,当运行文件为当前文件时,__name__参数默认值为_main_;当调用运行文件外的模块时,__name__参数默值为模块名(默认就意味着可以更改,但是没必要)
- 此功能为模块测试功能:测试本模块内部的函数,类
- 避免主模块变更的副作用:顶层代码,没有封装,主模块使用没有问题.一旦有了新的主模块,当前模块要被导入,由于源代码没有封装,一并执行