一.模块的简介
什么是模块:
模块就是一系列功能的结合体
模块的三种来源:
1.内置的
2.第三方的
3.自定义的
模块的四种表现形式:
1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)(***)
2.已被编译为共享库或DLL的C或C++扩展(了解)
3.把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包)(***)
包:一系列py文件的结合体
4.使用C编写并连接到python解释器的内置模块
为什么要使用模块:
1.用别人的模块可以加快开发效率(内置/第三方)
2.使用自定义模块,在一个项目中可能会多次使用,这样可以将其放在项目文件夹lib中,将其放在common.py文件中,当别的地方需要时可直接调用
ps:在调用文件的过程中一定要区分哪个是执行文件,哪个是被导入文件
双下name方法:在执行文件中__name__=__main__,多用在执行文件中,对执行文件进行测试如:
if __name__ == '__main__': # 快捷写法,在pycharm中输入main然后tab键 index1() index2()
如果文件是被当作模块导入的__name__输出为模块名(不加后缀)
二.模块导入的两种方式
2.1.导入两种方式:
1.import+模块名
右键运行执行文件发生的事(run.py):
1.首先会创建一个run.py的名称空间
2.首次导入模块(mk.py)
3.运行mk.py模块
4.将mk.py在运行中产生的名字和值存放在mk.py的名称空间中
5.在执行文件run.py中拿到一个指向mk.py名称空间的名字
ps:1.首次导入模块会创建名称空间,但是之后再次导入该模块,该模块的名称空间已存在,不会创建新的名称空间了,会沿用第一次导入的结果
2.当几个模块有相同的部分或者属于同一个模块时可以使用以下句式(不推荐)
mport+模块名1,模块名2,模块名3....
当几个模块没有联系的情况下应该分多次导入
import+模块名1 import+模块名2 ...
3.当模块的名字很长时,可以给模块取一个别名,如下:这样在在访问模块名称空间下的名字就可以写成kx.名字
import wohaokuaixina as kx
使用import打入模块,访问模块下名称空间的名字同意句式:模块名.名字
特点:1.指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突
2.访问模块中的名字必须严格按照句式模块名.名字
2.from...import....
右键运行执行文件发生的事(run.py):
1.首先会创建一个run.py的名称空间
2.首次导入模块(mk.py)
3.运行mk.py模块
4.将mk.py在运行中产生的名字和值存放在mk.py的名称空间中
5.在执行文件run.py中拿到一个指向mk.py名称空间中某个值的名字
ps:1.在使用from...import...句式访问模块中的名字不需要加模块名前缀,但是在访问模块中名字可能会产生冲突
2.可以使用from 模块名 import *的句式将模块中的名字一次性全加载出来(不推荐)
在这种方式里存在一个方法为__all__,在__all__=[],在列表中可以添加我们需要的名字,这样通过from 模块名 import *读到的名字就是咧白哦种的名字,这样可以限制导入者拿到的名字个数
三.解决文件循环导入的方法
3.1循环导入案例:
运行文件run.py
import mi m1.f1()
模块m1.py
print('正在导入m1') from m2 import y # 首次导入m2 x = 'm1'
模块m2.py
print('正在导入m2') from m1 import x # 第二次导m1 y = 'm2'
当运行run.py文件时,名称空间内入下图所示
3.2解决循环导入的方法一:将循环导入的语句写在最下方
#m1.py模块 print('正在导入m1') x = 'm1' from m2 import y #m2.py模块 print('正在导入m2') y = 'm2' from m1 import x
3.3解决循环导入的方法二:函数内导入模块
#m1.py模块 print('正在导入m1') def f1(): from m2 import y,f2 print('m1.f1>>>y:',y) f2() x = 'm1' #m2.py模块 print('正在导入m2') def f2(): from m1 import x print('m2.f2>>>x:',x) y = 'm2'
ps:如果在程序中出现循环导入问题,应该想办法取消循环,这应该在程序设计阶段就要避免,实在不行再用此种方式取解决
四.模块的查找顺序
4.1查找顺序:
1.内存
2.内置
3.sys.path(相当于环境变量)
ps:sys.path就相当于一个大列表列表中放了一大推文件路径,第一个文件路径就是执行文件所在的文件夹
五.模块的绝对导入,相对导入
绝对导入:绝对导入必须根据执行文件所在的文件夹路径为准,绝对导入无论在执行文件还是被导入文件都可以使用
相对导入:在相对导入中'.'代表当前路径,'..'代表上一级路径,'...'代表上上级路径.相对导入只能在被导入模块中使用,在使用相对导入时不需要考虑执行文件是谁,只需要考虑模块间的路径关系
六.软件目录目录规范
项目根目录:
1.启动文件夹(bin)--------------start.py文件
ps:启动文件也可以直接放在项目根目录下
2.配置文件夹(conf)[不经常改变的变量,IP,PORT,DATABASE]--------------setting.py文件
3.公共功能文件(lib)[其他文件可能要用到的功能]--------------common.py文件
4.核心逻辑文件夹(core)--------------src.py文件
5.日志文件夹(log)--------------log.log日志文件
6.数据库文件夹(db)
7.readme文本文件(对软件的介绍)