概述
模块导入知识详细
- 1 > 循环导入问题
- 2 > 判断文件类型
- 3 > 模块的查找顺序
- 3.1 > 验证先从内存空间查找
- 3.2 > 验证再从内置模块中查找
- 3.3 > 验证sys.path(类似于环境变量)
- 4 > 绝对导入与相对导入
- 4.1 > 绝对导入
- 4.2 > 相对导入
- 5 > 包
- 5.1 > 包的导入
- 6 > 编程思想演变
- 7 > 软件开发目录规范
1 > 循环导入问题
当两个文件彼此导入彼此的情况出现时,极有可能出现某个名字还没被创建就使用的情况,这个时候就会报错。所以我们需要在以后的编程生涯中,尽量去避免出现循环导入的问题。
如果确实需要循环导入,那么需要确保双方使用的名字都必须提前定义好。这里有两种方法:
# 方式一:将导入模块写在定义名字的下面
name = 'bob'
import md
---------------------------------------------
# 方式二:将导入模块的句式写在函数体代码中
def func_name():
import md
2 > 判断文件类型
py文件在导入模块的同时会被分为两种类型:
1.执行文件
2.被导入文件
我们可以通过通过内置变量__name__ 来区分
当__name__ 所在的文件是**执行文件**时,结果是__mian__
当__name__ 所在的文件是**被导入文件时**,结果会是文件名(模块名)
并且我们还可以通过__name__ 来区分被导入的代码和测试代码:
if __name__ == '__main__':
# 当前文件是执行文件时才会执行的子代码
''' 上述代码可以通过简写的方式写出来'''
直接输入main之后按tab键即可
3 > 模块的查找顺序
模块的查找顺序是第一步,先从内存空间查找,第二步再去内置模块中查找,最后还没找到才会去sys.path中查找(类似与环境变量)。如果在上述三个地方还找不到,那么才会直接报错。
3.1 > 验证先从内存空间查找
import md1
import time
time.sleep(15) # 睡眠期间将md1文件删除
print(md1.name)
上述代码的操作是,当我们运行代码时在代码睡眠期间,将模块md1快速删除。此时md1模块已经加载到了内存当中,我们将模块md1删除后,我们去使用模块当中的name这个变量它会去内存空间当中查找md1模块再使用其中的name这个变量。
3.2 > 验证再从内置模块中查找
import time
print(time)
print(time.time())
当我们不创建任何自定义模块的时候,去导入内置模块time。python解释器在内存空间找不到时就会去内置模块当中寻找相对应的模块名,并导入使用。
这里需要注意不可在创建py文件的时候起跟模块名(内置、第三方)有冲突的名字。
3.3 > 验证sys.path(类似于环境变量)
当我们利用上面的那两种方法还是没找到对应的模块名时,就会去sys.path里寻找。
import sys
print(sys.path)
print (sys.path)它的结果是一个列表当中存放了很多的路径,没有在内存中和内置中找到对应的模块名它会去sys.path的路径下面挨个查找。 我本机上的path路径如下:
['D:\Py Projiect\Day_3.24', 'D:\Py Projiect\Day_3.24', 'D:\PyCharm2020.3.3\plugins\python\helpers\pycharm_display', 'D:\Python3.6.8\python36.zip', 'D:\Python3.6.8\DLLs', 'D:\Python3.6.8\lib', 'D:\Python3.6.8', 'D:\Python3.6.8\lib\site-packages', 'D:\PyCharm2020.3.3\plugins\python\helpers\pycharm_matplotlib_backend']
sys.path中虽然有很多路径,但我们关注的主要还是第一个,第一个其实就是执行文件所在的路径。并且我们查找模块的时候只需要站在执行文件的所在路径查看即可。
当我们还是没有查找怎么办就可以利用这个sys.path来进行一些操作,操作如下:
# 操作一:主动添加sys.path路径(类似添加环境变量)
import sys
sys.path.append(r'模块存在的路径')
# 操作二:利用from...import...的句式指名道姓的去查找
from 模块存在的文件夹 import 模块名
这里我们可以利用 点的方式进入下一层目录
''' 例如我们想查找aa文件夹下的bb文件夹下的cc文件夹下的 mm 模块'''
from aa.bb.cc import mm
4 > 绝对导入与相对导入
在导入模块的时候一切查找模块的句式都是以执行文件为准,无论导入的句式是在执行文件中还是在被导入文件中!!!
4.1 > 绝对导入
永远按照执行文件所在的路径一层层往下查找(无脑查找即可)
4.2 > 相对导入
相对导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可。并且相对导入只能在被导入文件中是使用,不能在执行文件中使用。
5 > 包
从专业的角度来解释的话,包就是内部含有__init__.py的文件夹。从实际的角度来解释的话,包就是多个模块的结合体(内部存放了多个模块文件)
5.1 > 包的导入
在导入包的时候,索要名字其实就是跟包里面的__init__ .py索要。
1.如果想要直接通过包的名字使用包里的所有模块,那么就需要在__iter__.py文件中提前导入
# 这种方式的好处在于__init__可以提前帮你准备好可以使用的名字
2.也可以直接忽略__init__的存在,直接使用绝对导入即可
# 这种方式的好处在于不需要考虑包的存在,直接当初普通文件夹即可
6 > 编程思想演变
通过这么多天的学习我们已经渐渐的走过了三个阶段,第一阶段–小白阶段,第二阶段–函数阶段,第三阶段–模块阶段。
第一阶段--小白阶段
此阶段写代码就是在一个文件内不停地堆叠代码的行数(面条版本)
第二阶段--函数阶段
此阶段写代码我们学会了将一些特定功能的代码封装到函数中供后续反复调用
第三阶段--模块阶段
此阶段不单单是将功能代码封装成函数,并且将相似的代码功能拆分到不同的py文件中便于后续的管理
7 > 软件开发目录规范
在我们实际的工作中,编写的程序软件都是有很多文件夹和文件组成的。此时需要我们自己去将他整理,让这些文件夹和文件有它存在的意义和功能。
1.bin文件夹
存放程序的启动文件 start.py
2.conf文件夹
存放程序的配置文件 settings.py
3.core文件夹
存放程序的核心业务,能够实现具体的需求 src.py
4.lib文件夹
存放程序公共的功能 common.py
5.db文件
存放程序的数据 userinfo.py
6.log文件
存放程序的日志记录 log.log
7.readme文本文件
存放程序的说明、广告等额外的信息
8.requirements.txt文本文件
存放程序需要使用的第三方模块及对应的版本
最后
以上就是细心绿草为你收集整理的模块导入知识详细1 > 循环导入问题2 > 判断文件类型3 > 模块的查找顺序4 > 绝对导入与相对导入5 > 包6 > 编程思想演变7 > 软件开发目录规范的全部内容,希望文章能够帮你解决模块导入知识详细1 > 循环导入问题2 > 判断文件类型3 > 模块的查找顺序4 > 绝对导入与相对导入5 > 包6 > 编程思想演变7 > 软件开发目录规范所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复