D14 模块 导入模块 开发目录规范
1.模块的简介
1.什么是模块: 模块就是一系列功能的结合体
2.模块的三种来源: (1) 内置模块:python解释器自带的 (2)第三方模块:别人写的 (3)自定义的:自己写的
3.模块的四种表现形式:(1) 使用python编写的py文件
(2) 已被编译为共享库或DLL的C或C++扩展
(3) 把一系列模块组织到一起的文件夹
(4) 使用C编写并连接到python解释器的内置模块
4.为什么要用模块:(1) 用别人写好的模块(内置的,第三方的):典型的拿来主义,极大的提高开发效率
(2) 使用自己写的模块(自定义的):当多个文件中都需要使用相同的方法的时候 可以将该公共的方法写到一个py文件中,其他的文件以模块的形式导过去直接调用即可
5.模块的使用:一定要区分哪个是执行文件那个是被导入文件
2.import导入模块
1:import 使用语法 imort + 模块名,使用模块里的名字或方法时需要 模块名.变量(函数),通常导入模块的句式会在文件开头
import os # 导入内置os模块 print(os.path.dirname(__file__)) # 打印当前文件位置
创建a11.py文件
print('正在导入a11')
def my_sort(iterable): res = [] for i in iterable: for y,j in enumerate(res): if i > j: res.insert(y,i) break else: res.append(i) return res name = '小明'
import a11 # 导入自定义a11模块,也就是a11.py文件 print(a11.my_sort([1,23,545,674,324,21])) # 调用a11中的my_sort函数
2.导入名字复杂的模块时候取别名:例: 将a11文件名改为ttttttttttttttttttt.py
import ttttttttttttttttttt as f # 导入自定义ttttttttttttttttttt模块并通过as起一个简单的别名 print(f.name) # 可以通过别名来使用模块,相当于ttttttttttttttttttt.name
3.导入模块时内部的步骤: 在run.py程序中导入a11模块
- 右键运行run.py文件首先会创建一个run.py的名称空间
- 在第一次导入模块时 会先执行a11.py文件
- 运行a11.py文件中的代码将产生的名字与值存放到a11.py名称空间中
- run.py文件产生一个指向a11.py名称空间的名称空间
4.注意:多次导入不会再执行模块文件,会沿用第一次导入的成果,也就是只有第一导入会执行模块里面的代码
5.import特点: 指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突
3.from...import...导入模块
1:方法:
from a11 import my_sort # 只导入a11模块的my_sort方法 print(my_sort([1,24,5,67,344,22])) # 使用时不需要通过模块名.名字方法访问, print(name) # name没有导入所以不能使用.会报错
from a11 import * # 导入a11模块中的所有方法,不推荐使用 print(my_sort([1,24,5,67,344,22])) # 使用时不需要通过模块名.名字方法访问, print(name) # 可以使用
2.名字冲突
from a11 import name # 只导入a11模块的my_sort方法 name = 'xiaohong' print(name) # xiaohong 由于在内部又定义了一个变量name,将指向导入模块中name的指针重新指向新定义的name
3.导入模块时内部的步骤: 在run.py程序中导入a11模块
- 右键运行run.py文件首先会创建一个run.py的名称空间
- 在第一次导入模块时 会先执行a11.py文件
- 运行a11.py文件中的代码将产生的名字与值存放到a11.py名称空间中
- 直接拿到指向模块a11.py名称空间中某个值的名字
4.特点:访问模块中的名字不需要加模块名前缀,但可能会与当前执行文件中的名字冲突
5.__all__ 方法:可以限制导入者拿到名字的个数
4.循环导入模块:
1: 如果在导入模块出现循环导入问题一定时程序设计不合理,循环导入问题应该在程序设计阶段就避免
2解决方法:
(1) 将循环导入语句的句子卸载文件的最下方
(2) 在函数内部导入模块
5.__name__的用法:
1:__name__:(1): 当文件被当做执行文件执行的时候__name__打印的结果是__main__
(2): 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
2 :当我们在写完功能后测试的代码不希望被导入时执行时可以使用__name__方法判断
print('正在导入a11') def my_sort(iterable): res = [] for i in iterable: for y,j in enumerate(res): if i > j: res.insert(y,i) break else: res.append(i) return res name = '小明' if __name__ == "__main__": # 快捷键 main 加tab print(my_sort([1,223,332,4,24,6]))
6.模块的查找顺序 (py文件名不应该于模块名冲突)
1:先从内存中找
2:内置中找
3: path中找
7.绝对导入与相对导入
绝对导入: 必须依据执行文件所在的文件夹路径为基准,无论在执行文件还时被导入文件中都适用
相对导入: 不能在执行文件中使用, .代表当前路径 .. 代表上一级路径 ...代表上上级路径
8.开发目录规范:
1. bin 存放的是启动文件 (start.py) 通常放在项目根目录或bin文件夹
2. conf 存放一些常量,配置信息 (settings.py)
3. core 存放整个项目的核心逻辑 (src.py)
4.db 数据库相关 (userinfo.txt)
5. lib 存放一些公用方法(common.py)
6.log 存放日志(操作记录) (talk.log)
7.Readme.txt 使用说明
8 start.py文件内容
import os # 导入os模块 import sys # 导入sys模块 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # 获取软件安装的目录路径(当start.py在bin目录下) # BASE_DIR = os.path.dirname(__file__) # 当start.py在项目根目录下 sys.path.append(BASE_DIR) # 将用户安装路径添加到path中 from core import src # 从core文件夹导入src模块 if __name__ == '__main__': src.run() # 执行启动文件