一、模块介绍
什么是模块?
模块:就是一系列功能能的结合体
模块的三种来源:
1、内置;2、第三方;3、自定义。
模块四种表现形式:
1、使用python编写的py文件(意味着py文件也可以称之模块)
2、已被编译为共享库或DLL的C或C++扩展(作为了解即可)
3、把一系列模块组织到一起的文件夹
4、使用C编写并连接到python解释器的内置模块
为什么要用模块?
1、别人写好的模块(内置,第三方),拿来直接可以用,省事。
2、使用自己写的模块:放程序比较庞大的时候,自己的项目不可能只在一个py文件中,那么当有多个文件都需要使用相同的方法的时候,
可以将该公共的方法写到一个py文件中,其他文件以模块的形式到过去直接调用即可。
如何使用模块?
直接调用,方法》》》import /from...import...
注意一定要区分那个是执行文件,那个是被导入文件
二、导入模块:
import
1、运行run.py文件首先会创建一个run.py的名称空间
首次导入模块 例:md.py文件
1、执行md.py文件
2、运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
3、在执行文件中产生一个指向名称空间的名字(md)
多次导入不会再执行模块文件,会沿用第一次导入的结果
2、使用import导入模块,访问模块名称空间中的名字统一句式:模块名,名字
用法特点:
1、指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突。
2、如果想访问模块中名字,必须用模块名 . 名字的方式
ps:只要当几个模块有相同部分或属于用一个模块,可以使用上面的方法
当几个模块没有联系的情况下,应该分多次导入
例:import os
import time
import md
通常导入模块的局势会卸载文件的开头;当模块名字比较复杂的情况下,可以给模块去别名
from...import...
1、和import运行前两步一样,第三步:直接拿到指向模块md1.py名称空间中某个值的名字
用法缺点:
1、访问模块中的名字不需要加模块名前缀
2、在访问模块名字可能会与当前执行文件中的名字冲突
2、补充:
from ...import * # * 一次性将模块中的名字全部加载过来
__all__可以指定当所在py文件被当模块导入的时候,可以限制导入者能够拿到的名字个数
三、循环导入
循环导入出现,一定是程序设计的不合理,在设计阶段应该避免
解决循环导入的问题的方式
1、将循环导入的语句放在被导入语句下方
2、导入模块语句放在函数体代码内
四、__name__用法
当文件被当做执行文件执行时,__name__打印的结果是__main__
当文件被当做模块导入时,__name__打印的结果模块名(无后缀)
def index1(): print('index1') def index2(): print('index2') if __name__ == '__main__': # 快捷写法 main直接tab键即可 index1() index2()
五、模块查找顺序:
1、先从内存中找
2、次从内置中找
3、sys.path中找(类似环境变量)
ps:一定要分清楚谁是执行文件,谁是被导入文件
一堆文件路径,第一个路径永远都是执行文件所在的文件夹
注意py文件名不应该与模块名(内置的,第三方)冲突
import sys sys.path.append(r'D:Python项目day14dir1') print(sys.path) # 添加文件路径
六、绝对导入和相对导入
绝对导入必须依据执行文件所在的文件夹路径为准
1.绝对导入无论在执行文件中还是被导入文件都适用
相对导入只能用在模块文件中使用,无序考虑执行文件问题,只需要知道模块和模块之间路径关系
.代表的当前路径
..代表的上一级路径
...代表的是上上一级路径
from . import m2
from ... import test # 往上回3个路径
七、软件开发目录规范
1、bin 》》》start.py 启动文件
2、conf 》》》settings.py 配置文件
3、core》》》src.py核心文件
4、db 》》》数据库
5、lib 》》》common.py 公共文件
6、log》》》daily record.txt 日志
7、readme.txt 》》》解释文件
start.py启动文件也可放在文件跟目录下
固定格式:
import sys import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) """ pycharm会自动将你新建的最顶层的目录自动添加到环境变量中 上面这两句话 不是针对你的 是针对下载你这个软件的用户 """ from core import src if __name__ == '__main__': src.run()