05_01、模块
一、模块简述
(一)、什么是模块
模块是一系列功能的集合体,分为三大类
1、内置模块
2、第三方模块
3、自定义模块
一个python文件本身就是一个模块,文件名m.py,模块名叫m
(二)、模块的表现形式
1、使用python编写的.py文件,(一个py文件就是一个模块)
2、已编译为共享库或DLL的C或C++扩展
3、把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py的文件,称为包,也是多个py文件的组合)
4、使用C编写并链接到python解释器的内置模块
(三)、为何要用模块
1、内置与第三方模块,拿来即用,极大地提高了自己的开发效率
2、自定义的模块
可以将程序的各部分功能提取出来放到一个模块中为大家共享使用
二、如何使用模块
(一)导入模块
模块的导入方式有import 和from...import...两种
1、import 句式
1、导入
import md
2、运用
md.x
模块被导入时会发生三件事
1.运行执行文件,产生一个执行文件的全局名称空间
2.运行被导入文件
3.导入文件中的名字放入到导入文件的名称空间
4. 在执行文件的名称空间中有一个md的变量指向导入文件的名称空间
注意:
1. 模块会执行,但是导入多次,只会执行一次
2. 在自己的名称空间中如果有与导入文件相同的名字,在调用的时候,指名道姓的调用,不会产生冲突的
2、 from...import...句式
单个导入:from md import money
多个导入:from md import moeny,name,gender
from...import句式首次被导入:
1. 产生一个执行文件的名称空间
2. 会运行导入文件
3. 产生一个导入的名称空间
4. 在执行文件中产生一个money,执行导入文件的money,导入文件中的其他没有被导入的不能在执行文件中使用,如果想使用,继续导入过来就可以使用
(二)模块灵活运用的补充方式
1、起别名
给模块名起别名 import mdddddddddddd as d
给模块中的某一个名字起别名 from md import read1 as r
起别名通常用来给名称过长的模块或变量使用,方便书写
同时可以保证文件名不和内置模块名冲突
2、多个模块的连续导入
1、可以一行导入一个
import time
import os
import sys
2、可以一行导入多个
模块:mport time,os,sys 注意:这里推荐是用一行导入一个,因为格式简明清晰
变量名:from mdddddddddddddddddddddddddd import a,b,c,d
3、通用导入
from md import *
它的作用相当于import md,可以使用md里面所有的变量名
(三)if __name__ == '__main__'的运用
__name__内置方法的特性:
如果print(__name__)当前所在文件是执行文件:打印__name__返回值为'__main__'(字符串类型)
如果print(__name__)当前所在文件是导入文件,运行导入它的文件打印出的__name__返回值是被导入的模块名
根据其特性:
在执行模块中写入if __name__ == '__main__',可以通过if
在导入模块中写入if __name__ == '__main__',不可以通过if
(四)循环导入问题
循环导入不允许出现
解决方式1:导入语句放到末尾
解决方式2:导入语句放在函数中
(五)模块的查找顺序
1、查找顺序
1. 先从内存中查找
2. 从内置中查找
3. 从sys.path中
2、如果在执行文件中找不到导入模块,解决方案:
1.通过sys.path.append()添加导入文件路径到相关路径集
补充知识:
sys模块
sys.path 相关路径集
sys.path.append() 添加路径到相关路径集
2、从当前级向下级导入模块的方法
from aaa import bbb
from aaa.bbb.ccc import ddd
3、从当前级向上级导入模块的方法
pass
(六)限制导入 __all__=['a','b']
__all__的内置方法是只能允许本模块中的数据a和数据b被导入
三、相对导入和绝对导入
1、绝对导入
有sys.path和form...import两种方式
1、sys.path.append(绝对路径)
2、form...import
如:from aaa import m2(因为aaa已经在环境变量中)
注意:绝对导入,默认都是以执行文件为准,从sys.path中查找
2、相对导入
相对导入主要使用的句点符
一个句点符 . 代表的是当前目录
两个句点符 .. 代表的是上一级目录
eg:
from . import m2 同层级下在m1中可以直接相对导入同层级m2
from .bbb import m2 根目录下m1可以相对导入根目录下bbb文件夹下的m2
from .bbb.ccc import m2 根目录下m1可以相对导入根目录下bbb文件夹下的ccc文件夹中的m2
3、特别注意:在执行文件中,不能出现相对导入
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通