模块
一.模块初识
什么是模块:
模块:就是一系列功能的集合
模块的三种来源:
1.内置模块(python解释器自带)
2.第三方模块
3.自定义模块
模块的四种表现形式
1.使用python编写的py文件(一个py文件也可以称为一个模块)
2.已被编译为共享库或DLL的C或C++扩展
3.把一系列模块组织到一起的文件夹(有一个__init__.py文件的文件夹被称为包)包:一系列py文件的结合体
4.使用C编写并连接到python解释器的内置模块
为什么要用模块:
1.调用别人成熟的模块(内置的,第三方的)可以极大的提高使用者的开发效率
2.当项目规模过大时,为了使程序结构清晰,方便进行管理
可以把多个文件所需要的公共方法写入一个叫common.py文件中,其他的文件以模块的形式直接调用即可
如何使用模块:
模块的使用方法有两种,是import和from.....import......
使用模块的关键是区分执行文件和被导入文件。
可以使用__name__方法进行测试,返回值是__main__时,说明文件是可执行文件,返回模块名(没有后缀)时是被导入文件。
ps : if __name__ == '__main__': # 快捷写法 main+tab/enter键即可
二.模块使用之import
使用方法 :import 模块名
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys # 推荐一行一个模块
右键运行执行的.py文件首先会创建一个该执行文件的名称空间
首次导入模块xxx.py,执行的三件事
1.执行xxx.py文件
2.运行xxx.py文件中的代码将产生的名字与值存放到xxx.py名称空间中
3.在执行文件中产生一个指向名称空间的名字(xxx)
重复模块只会在第一次导入时,被执行。(第一次执行过后,模块名被写进sys.module,当模块在sys.module存在时,不会被执行)
ps :可以从sys.module中找到当前已经加载的模块.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import diaobao # 推荐一行一个模块 import sys # 推荐一行一个模块 import diaobao as db print(sys.modules) # 查看已加载模块
使用import导入模块 访问模块中变量的方法:模块名.名字
1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
2.必须用模块名.名字的方式访问模块中的名字
import可以一次导入多个模块(不推荐使用,看起来代码逻辑不够清晰)
ps:通常导入模块,会写在文件的开头
模块名重命名 import 模块名 as 修改后的模块名
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys,diaobao # 不推荐使用 import diaobao # 推荐一行一个模块 import diaobao as db print(db.x)
三.模块使用之from......import .....
使用方法 :from 模块名 import 变量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from diaobao import x # 推荐一行一个模块
会创建一个该执行文件的名称空间
首次导入xxx.py模块
1.执行xxx.py文件
2.运行xxx.py文件中的代码将产生的名字与值存放到xxx.py名称空间中
3.直接拿到指向模块xxx.py名称空间中某个值的名字
from...import...:
优点:引用模块中的名字不用加前缀(模块名),使用更为简洁
缺点:模块中的名字容易与当前执行文件名称空间中的名字冲突
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys # 推荐一行一个模块 from diaobao import x # 推荐一行一个模块 print(x) x = 30 print(x)
from md1 import * # 一次性将md1模块中的名字全部加载过来 不推荐使用
当所在的py文件被当作模块导入时候,可以该py文件内部使用__all__方法,限制导入者拿到的名字个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
__all__ = ["x"] # 模块被调用时只能访问变量x x = "被调用对象" y = 20
四.循环导入
循环导入问题出现的原因: 程序设计不合理
假如循环导入问题出现,解决方式如下
1.方式1
将导入写在文件最下方(或者被调用的变量之后,导入模块)
2.方式2
函数内导入模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from dir1.dir import m1 m1.f1()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
print('正在导入m1') def f1(): from dir1.dir.m2 import y,f2 print('m1.f1>>>y:',y) f2() x = 'm1'
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
print('正在导入m2') def f2(): from dir1.dir.m1 import x print('m2.f2>>>x:',x) y = 'm2'
五.模块的查找顺序
模块的查找顺序
1.先从内存中找
2.内置中找
3.sys.path中找(环境变量):
sys.path是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
print(sys.path)
六.绝对路径和相对路径
绝对导入必须依据执行文件所在的文件夹路径为准
1.绝对导入无论在执行文件中还是被导入文件都适用
相对导入
.代表的当前路径
..代表的上一级路径
...代表的是上上一级路径
ps:相对导入不能在执行文件中使用,只能在被导入的模块中使用使用相对导入
不需要考虑执行文件到底是谁 只需要知道模块与模块之间的路径关系
七.软件目录开发规范
项目名
bin文件夹
start.py项目启动文件
conf文件夹
settings.py项目配置文件
core文件
src.py项目核心逻辑文件
db文件夹
数据库文件
lib文件夹
common.py项目所用到的公共的功能
log文件夹
项目的日志文件
readme文本文件 介绍项目
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# start.py import sys import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) # "os.path.dirname(__file__)"拿到的是当前start.py文件所在的上一层目录 """ pycharm会自动把项目的最顶层的目录自动添加到sys.path中 """ from core import src if __name__ == '__main__': src.run()