模块简介
1.什么是模块
模块可以看成是一系列功能的集合。我们使用模块就相当于使用这个集合的所有功能。
2.模块的分类
2.1. 内置模块
python解释器自带的,直接导入使用即可
2.2. 自定义模块
自己写的模块
2.3. 第三方模块
别人写的模块,使用前应先install,功能繁多且强大
3.模块的表现形式
3.1. py文件(py文件也可以称之为模块文件)'模块文件的命名必须是全英文'。
3.2. 含有多个py文件的文件夹(按照模块功能的不同分类存储)
3.3.已被编译为共享库或DLL的c或C++扩展(了解)
3.4.使用C编写并链接到python解释器的内置模块(了解)
模块导入
1. import 文件名 句式
执行顺序:
'''
1.先在执行文件中创建名称空间
2.执行被导入文件,创建其对应名称空间,存储被导入文件中的所有名字
3.在执行文件中获取被导入模块的名字,该名字指向整个被导入文件的名称空间,通过该名字加点的方式就能获取被导入文件名称空间中对应的名字。
'''
注意:同一个程序反复导入相同的模块,导入语句只会执行一次。
import md 有效
import md 无效
import md 无效
2. from...import... 句式
可以是:from 模块名 import 变量名
也可以是:from 文件夹 import 模块名
这种导入方式更像是指名道姓的导入
执行顺序:
'''
1.创建执行文件的名称空间
2.创建被导入文件的名称空间
3.执行被导入文件中的代码,将产生的名字存储在被导入文件的名称空间中
4.执行文件运行,在执行文件中找到指定的名字,该名字指向被导入文件的名称空间。
'''
3.两种导入方式的对比:
import 文件名 句式
优点:通过 '文件名点' 的方式可以访问被导入模块中所有的名字,且不容易与执行文件名称空间中的名字冲突。
缺点:什么都能点,有时候并不想让所有的名字都能被使用。且必须加前缀。
from...import... 句式
优点;指名道姓地使用指定的名字,且不需要加模块前缀名。
缺点:名字及其容易冲突(绑定关系被修改)
4.被导入模块名(变量名)可以起别名
from md import money as m
import mddd as m
一般适用于多人开发导致模块名重复的情况,或者是模块名过长的情况。
5.可以一次性导入多个模块(变量名)
import time, sys, os
'不建议一次性导入多个功能不同的模块'
from md import money, money1, money2
'推荐一次性导入一个模块中的多个名字'
6.from...import...句式也可以全部导入
from md import * # *表示所有
针对*号的导入还可以在被导入文件中控制名字的数量
在模块文件中使用__all__ = [变量名] 控制*能获取到的名字。
7.循环导入问题
循环导入就是两个文件彼此导入。
循环导入极容易出现报错现象,原因是使用的名字还没定义好,就被导入了。
解决方案:彼此在使用彼此名字之前就定义好。
判断文件类型
1.所有的py文件都自带一个__name__内置名
当该文件是执行文件的时候 __name__ 的结果是 __main__
当该文件是被导入文件的时候 __name__的结果是模块名
2.__name__主要用于开发模块的作者测试自己的代码使用
if __name__ == '__main__':
当文件是执行文件的时候才会执行if的子代码(一般只出现整个程序的启动文件中)
模块的查找顺序
'先去内存中查找-->再去内置中查找-->再去sys.path中查找(程序系统环境变量)'
导入模块的时候一定要知道谁是执行文件,所有的路径都是依据执行文件来的
import sys
sys.path.append(r'D:\pythonProject\day22\xxx')
import mdd
print(mdd.name) (不设置path变量会报错)
'''
1.通用的方式
sys.path.append(目标文件所在路径)
2.利用from...import句式
起始位置一定是执行文件所在路径
from xxx import mdd
'''
绝对导入与相对导入
绝对导入
1.其实就是以执行文件所在的sys.path为起始路径,往下一层层查找。每往下一层,就要用句点符点出来。
2.pycharm会自动将项目根目录添加到sys.path中
3.当我们不使用pycharm运行,就需要我们手动地将项目根目录添加到sys.path中。(用到os模块)
绝对导入时以执行文件所在的sys.path为起始路径
pycharm会自动将项目根目录添加到sys.path中,所以即使01.py不在根目录,也能直接访问到其他的根目录文件夹内的a.py
相对导入
储备知识
. 在路径中表示当前路径
.. 在路径中表示当前路径上一级的路径
../.. 在路径中表示当前路径上上一级路径
1.相对导入可以不参考执行文件的路径,直接以当前模块文件路径为准。
2.只能在模块文件中使用,不能在执行文件中使用。
3.相对导入在比较复杂的情况下,容易出错,尽量少用。
相同目录下的模块a和b互相能够相对导入
包的概念
1.包就是含有__init__.py文件的文件夹
2.包的作用:存放多个py文件(模块文件),能够更加清晰方便地管理多个模块文件
3.导入方法同模块一样 import 包名
导入包名其实是导入里面的__init__.py文件,该py文件里有什么我们才能用什么。但是也可以跳过该文件直接访问包里的其他文件。
4.在python2中必须含有__init__.py文件的文件夹才能叫包,否则import 包报错
在python3中无所谓。
5.包的本质就是一种模块,创建包的目的不是为了运行,而是被导入使用
软件开发目录规范
1.bin文件夹
用来存放项目的启动程序 start.py
2.core文件夹
用于存放项目的核心代码 src.py
3.conf文件夹
用于存放项目的配置文件 settings.py
4.lib文件夹
用于存放项目的公共功能(方法,函数) commen.py
5.db文件夹
用于存放项目的数据文件(以后会被数据库软件代替) userinfo.txt
6.log文件夹
用于存放项目的日志文件(以后会有专门的日志模块服务) log.log
7.interface文件夹
用于存放项目的接口文件(项目较大文件较多时考虑创建该文件夹) user.py order.py
8.readme.txt文件
编写项目的说明、介绍、注意事项,类似于说明书
9.requirement.txt文件
编写项目所需模块的名称和版本
10.start.py文件
一般放在bin目录下,也可以放在项目根目录
文件(夹)命名不必完全按照上面的命名,但尽量做到见名知意。