pthon模块
为什么使用模块?
- 代码重用
- 避免属性冲突
为了更好地组织和管理模块,python引入了包,在某个目录下添加模块__init__.py后,该目录就变成了包。目录支持嵌套,所以包也支持嵌套,包中还可以有子包。
相对导入
使用相对路径导入模块时,其中,一个.表示当前目录,两个..表示当前目录的父目录。当直接运行某个模块时,该模块就变成了主模块。主模块位于最顶层,与同目录下的其它模块无法形成相对关系。因此,当直接运行某个模块时,该模块不能相对导入。
import语句的执行流程
当使用import语句导入模块时,解析器会根据sys模块的modules属性值来查找模块是否已经导入了。
如果模块已经被导入,解析器不做任何操作。
如果模块没有被导入,
(1)解析器按照某种路径搜索模块;
(2)讲搜索到的模块编译为pyc字节码文件;(可选)
(3)执行编译生成的字节码文件从而运行模块。
解析器搜索模块的路径:
import sys
from pprint import pprint
pprint(sys.path)
搜索路径主要由三部分组成:
- 当前目录
- 标准库目录
- 第三方库安装目录
修改解析器搜索模块的路径
- 直接修改sys.path,但是在代码运行后失效。
- 直接修改PYTHON_PATH
重新加载模块
当使用import导入模块之后,模块被修改,如果再次使用import导入模块,是不会生效的。
需要使用importlib中的reload()方法,重新加载模块。
import my_module, time
import importlib
for i in range(100):
importlib.reload(my_module) # 动态重新加载模块
print(my_module.a)
time.sleep(1)
模块访问控制
当某个模块前加单下划线_时,不能通过import *导入,但是可以通过import _xxx导入。