python 模块和包
目录
模块
模块的导入
模块的查找顺序
绝对导入和相对导入
包
包的导入
案例
python 模块
定义:模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。
作用:模块可以被别的程序引入,以使用该模块中的函数等功能。
模块导入import
使用方法:
1. 导入内置函数时
import os
2. 导入在相同目录的文件中
run.py 和 test.py,在run.py文件中导入test.py文件如下:
import test.py
语法:
import module_name
位置:
1. 一般放在文件的开头。
2. 当导入大量的文件时,包的顺序时,内置,第三方,自定义的包。
3. 但导入包的名字过长时,可以取别名:
import module_name as mn
注意:多次导入同一个模块,只会执行第一次导入的结果。
导入后文件运行流程:
有两个文件分别是run.py和md.py,run.py为执行文件,md.py为被导入文件,运行run.py
会创建一个run.py的名称空间,首次导入模块,执行md.py文件,运行md.py中的代码,运行中
产生的名字和值放到md.py中,在执行的文件(run.py)中会产生一个指向md.py的名称空间的名字(md),
这个时候run.py中就可以使用md.py中的函数、变量等资源。、
如图:
模块导入form...import...
from 语句让你从模块中导入一个指定的部分到当前命名空间中
语法:
from module_name import name
说明:
module_name: 模块名
name: 模块中类、函数、变量名等
使用方法: 导入在相同目录的文件中
run.py 和 test.py,在run.py文件中导入test.py的func函数文件如下:
from test.py import func
导入后文件运行流程:和import一样
注意:
__all__在被导入文件中指的是被导入文件中可以使用的类、函数等。
__all__ = ['money','read1','read2']
模块的查找顺序
1.先从内存中找
2.内置中找
3.sys.path中找(环境变量)
import sys sys.path.append(r'D:\Python项目\day14\dir1')
form dir1.dir import md
绝对导入和相对导入
1. 绝对导入必须依据文件所在的文件路径为准
绝对导入无论在执行文件中还是被导入文件都适用
2.相对导入
.代表的当前路径
..代表的是上一级路径
...代表的是上上一级路径
注意:相对导入不能再执行文件中使用
相对导入只能在被导入的模块中使用,使用相对导入就不需要考虑执行文件到底是谁,只需要知道模块与模块之间路径关系
python 包
定义:是一系列模块的结合体从,形成一个目录。
包的本质: 也是一种模块。
包的表现形式: 就是一个文件夹。
包的创建: 创建一个包,会在包的文件夹下生成一个__init__.py文件
pool/ #顶级包 ├── __init__.py ├── futures #子包 │ ├── __init__.py │ ├── process.py │ └── thread.py └── versions.py #子模块
包的导入:
包是一种模块的表现形式,因而包或包中的模块都是被导入使用的,而非直接执行。
导入包所做的事情:
1、执行包下的__init__.py文件
2、产生一个新的名称空间用于存放__init__.py执行过程中产生的名字
3、在当前执行文件所在的名称空间中得到一个名字pool,该名字指向__init__.py的名称空间,
例如pool.xxx和pool.yyy中的xxx和yyy都是来自于pool下的__init__.py,也就是说导入包时并不会导入包下所有的子模块与子包
注意:
创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块
案例
1. 循环导入问题?
原因:如果出现循环导入问题,那么一定是你的程序设计的不合理。
解决方案:
1. 循环导入问题应该在程序设计阶段就应该避免。
2. 将循环导入的句式写在文件的最下方
3. 函数内导入模块
2. python2和python3包的区别?
在python3中,即使包下没有__init__.py文件,import 包仍然不会报错;
而在python2中,包下一定要有该文件,否则import 包报错。
3 . 包下的__init__py文件是什么?有什么作用?
__init__.py的主要作用是:
1. Python中package的标识,不能删除
2. 定义__all__用来模糊导入
3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)
4. 批量导入