模块于包 软件开发目录规范
今日内容概要
主题:模块基本使用全部结束
1.循环导入问题
2.判断文件类型
3.模块的查找顺序(重要)
4.绝对导入和相对导入
5.模块与包(简单)
今日内容详细
强调 :日后的工作中项目的文件肯定都是以英文为主
循环导入问题
#两个文件彼此导入彼此
循环导入的时候极有可能出现某个名字还没有被创建就使用的情况导致报错
"""
在以后的编程生涯中 尽量去避免出现循环导入的问题
"""
如果确实需要循环导入 那么需要确保双方使用的名字都必须'提前定义好'
方法一:将导入模块的句式写在定义名字的下面
方法二:将导入模块的句式写在函数体代码中
判断文件类型
py文件可以被分为两种类型
1.执行文件 2.被导入文件
有一个内置变量 __name__
当__name__所在的文件是执行文件的时候 结果是__main__
当__name__所在的文件是被导入文件的时候 结果是文件名(模块名)
可以借助__name__区分被导入的代码和测试代码
if __name__ == '__main__ ':
当前文件是执行文件的时候才会执行的子代码块
"""
由于上述代码子在很多启动脚本中经常使用 所以有简写方式
直接输入main之后按tab键即可"""
模块的查找顺序
"""
1.先从内存空间中查找
2.再从内置模块中查找
3.最后去sys.path查找(类似于我们前面学习的环境变量)
如果上述三个地方都找不到 那么直接报错
"""
1.验证先从内存空间中查找
import md1
import time
time.sleep(15) # 睡眠期间将md1文件删除
print(md1.name)
2.验证再从内置模块中查找
import time
print(time)
print(time.time())
"""强调:在创建py文件时候一定不要跟模块名(内置,第三方)冲突!!!"""
3.验证 sys.path(类似于我们前面学习的环境变量)
import sys
print(sys.path) # 结果是一个列表 里面存放了很多路径
"""
当内存中和内置中都没有要查找的模块时 就会去下面的路径中挨个查找
"""
sys.path中虽然有很多路径 但是只需要重点关注第一个
第一个其实就是执行文件所在的路径
###########
查找模块的时候只需要站在执行文件所在的路径查看即可
###########
如何解决
方式1:主动添加sys.path路径(类似于添加环境变量)
import sys
sys.path.append(r'路径’)
pycharm会自动将项目目录所在的路径添加到sys.path中
方式2:利用from...import...句式指名道姓的查找
from 文件夹 import 模块名 # 从文件夹中导入模块
from 文件夹.文件夹.文件夹 import 模块名
# 通过 . 的方式进入下一层目录
绝对导入和相对导入
1.在导入模块的时候一切查找模块的句式都是以执行文件为准
无论导入的句式是在执行文件中还是在被导入文件中
# 绝对导入
永远按照执行文件所在的路径一层层往下查找(无脑查找即可)
# 相对导入
相对导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号,去查找其他模块即可
from . import a
相对导入只能在被导入文件中使用 不能在执行文件中使用
预备知识
. 表示当前路径
.. 表示上一层路径
../.. 表示上上一层路径
"""以后如果想一劳永逸 那么就只使用绝对导入即可"""
包
# 从专业的角度来解释的话
包就是内部含有__init__.py的文件夹
# 从实际的角度来解释的话
包就是多个模块的结合体(内部存放了多个模块文件)
eg:我们的电脑某个文件夹下面有很多不同类型的文件
为了方便管理我们会习惯性的创建不同的文件夹分类管理
# 在python解释器中甚至直接提供了创建包的选项
本质就是文件夹里面有一个__init__.py文件
"""
在导入包的时候 索要名字其实是跟包里面的__init__.py要
1.如果想直接通过包的名字使用包里面所有的模块,那么需要在__init__.py中提前导入
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
2.也可以直接忽略__init__的存在使用绝对导入即可
上述方式的好处在于不需要考虑包的存在直接当成普通文件夹即可
"""
包里面的__init__可以看成是你的管家
你可以吩咐它帮你做事 也可以直接架空它自己动手
软件开发目录规范
# 我们实际工作中编写的程序软件都是有很多文件夹和文件组成的
这些文件夹和文件其实都有各自存在的意义和主要功能
1.bin文件夹
存放程序的启动文件 start.py
2.conf文件夹
存放程序的配置文件 settings.py
3.core文件夹
存放程序的核心业务 src.py
就是最为重要的代码 能够实现具体需求
4.lib文件夹
存放程序公共的功能 common.py
5.db文件夹
存放程序的数据 userinfo.txt
6.log文件夹
存放程序的日志记录 log.log
7.readme文本文件
存放程序的说明,广告等额外的信息
8.requirements.txt文本文件
存放程序需要使用的第三方模块及对应的版本
ps:目录的名字可以不一致 但是主要的思想是一致的
就是为了便于管理
拿到启动文件之后直接运行即可 无需考虑程序内部的复杂程度 便于管理
当代码越来越多的时候 你才能体会到拆分的好处