模块的表现形式、使用时内部发生的细节、循环导入问题、__name__的用法等
模块:
就是一系列功能的结合体
模块的三种来源:
1.内置的(python解释器自带的)
2、第三方的(别人写的)
3、自定义的(自己手写的)
模块的四种表现形式:
1.自己用Python编写的py文件也可以成为是一个模块
2.已被编译为共享库或DLL的C或C++扩展(了解)
3.把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包)
包:一系列py文件的结合体
4.使用C编写并连接到python解释器的内置模块
为什么使用模块:
1、使用别人写好的模板(内置或者第三方的)可以极大的提高开发效率,而且自己写的话不一定功能那么全面。
2、自定义的模板:当你在遇到一个规模较大的项目时,内部可能会有很多重复的方法,这是就需要分开写在不同的py文件中,再将一些公共的方法在一个py文件中,其他py文件想要使用这些方法时可以直接以模块的形式直接调用。
如何使用模块:
(****重点****)要正确区分哪个是执行文件哪个是被导入文件。
右键运行run.py文件首先会创建一个run.py的名称空间
首次导入模块(md1.py)(******)
1.执行md.py文件
2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
3.在执行文件中产生一个指向名称空间的名字(md)
多次导入不会再执行模块文件,会沿用第一次导入的成果(******)
在使用import导入模块时,访问模块中名称空间中的变量时,为模块名.变量名,永远不会和执行文件中相同的变量名发生冲突,想访问模块中的名字是必须使用模块名.名字的方式。
重点:
1.函数是第一类对象,只要通过变量名得到这个函数的内存地址,就可以通过变量名加括号的形式来调用这个函数
2.函数在定义阶段,它内部变量取值的查找顺序就已经固定死了,不会因为调用位置的改变而改变。
当几个模块之间有联系或者具有相似部分时导入时可以写在一行,否则需要分多次导入。
当模块名字较长较复杂是可以为其取个别名:import 模块名 as 别名
异常通常有两类:
1、语法结构错误:需要当场修改,异常处理try:....except:....检测不到
2、逻辑结构错误:异常捕获可以处理
使用from 模块名 import 变量名 时过程与使用import时相似
但是可以直接拿到被调用模块中的某个变量名
使用这种方式的缺点:
1.访问模块中的名字不需要加模块名的前缀
2.容易与执行文件中相同的变量名产生冲突
from md1 import *可以调用md1中全部的名字,但是不太推荐使用,因为不清楚有哪些可以用,造成内存的过量占用。
__all__可以用来限制调用模块时可以得到的名字
__all__ = ['money','read1','read2']#在别的模块中调用时只能得到列表中的这些名字。
循环导入问题的解决方案:
循环导入问题:
当右键运行run.py文件时,先创建一个run.py的名称空间,第一次导入m1时,先创建m1的名称空间,打印正在导入m1,之后又去导入m2,m2也是第一次被导入,所以先创建一个m2的名称空间,之后m1中创建m2指向m2的名称空间,之后m2中第二次导m1,但是这时需要导入的x并没有被创建所以会出现报错现象,这就是循环导入问题。
循环导入问题一定是你的程序设计的不合理,我们应到在程序设计阶段就避免。
解决方案:
方式1:
将循环导入的句子写在文件的最下方
方式2:
函数内导入模块(如上图)
__name__:可以用来区分文件时执行文件还是被当做模块调用,防止了被当做模块调用时,文件还要被运行一遍的尴尬局面。
具体用法:
def index2():
print('index2')
# print(__name__)
# 当文件被当做执行文件执行的时候__name__打印的结果是__main__
# 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
# if __name__ == '__main__':
# index1()
# index2()
快捷写法:main之后直接按tab键即可。
模块的查找顺序:
1、先从内存中找
2、从内置中找
3、从sys.path中找(环境变量):
****重点*****:需要正确区分谁是执行文件,谁是被导入文件。(因为查找过程中是以执行文件为基准去找的)
是一个放着一堆文件路径的大列表,但第一个文件路径永远是执行文件的所在文件夹。
import time
import md
time.sleep(20)
md.f1()
用来验证是否先从内存中取,需要在time.sleep(20)时,将md.f1()删掉,证明已经事先将模块加载到内存中了。
还需要注意自定义模块名(文件名)不应该与内置的(和第三方的)模块名冲突
import sys
sys.path.append(r'D:\Python项目\day14\dir1') #将这个文件夹添加到环境变量中
print(sys.path)
绝对导入:需要依据执行文件所在的文件夹路径为准
在执行文件中和被导入文件中都适用
from dir1.dir import m1
m1.f1()
相对导入:
.表示当前路径
..表示上一级路径
...代表上上一级路径
注意:
1、相对导入不能在执行文件中用
2、相对导入不用考虑执行文件是哪个,只需要关心当前模块与被导入文件之间的路径关系。
软件开发目录规范:
1、项目启动文件通常放在两个地方
1、bin文件夹下
start.py
2、直接放在根目录
2、conf:配置文件
settings.py
3、lib:公共的方法
common.py
4、core:核心逻辑代码
src.py
5、log:日志
talk_log.py
6、db:数据库相关的操作
userinfo.txt
7、readme:对软件的介绍
将ATM的文件夹放到环境变量中,可以兼容所有用户
__file__:当前的文件所在位置
启动文件的固定格式:
import sys
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))#dirname返回上一级
sys.path.append(BASE_DIR)
from core import stc
if __name__=='__main__'
src.run()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)