今日总结

  • 循环导入问题

  • 判断文件类型

  • 模块的查找顺序

  • 绝对导入与相对导入

  • 模块与包

  • 软件开发项目规范

 

循环导入问题

两个文件彼此导入彼此
循环导入的时候极有可能出现某个名字还没有创建就使用的情况导致报错
'''我们要尽量去避免出现循环导入的问题'''
如果确实需要循环导入 那么需要确保双方使用的名字提前定义好
方法:
1.将导入模块的句式写在定义名字的下面
2.将导入模块的句式写在函数体代码内

 

判断文件类型

py文件可以分为两种类型
1.执行文件
2.被导入文件
有一个内置变量__name__
当__name__所在的文件是执行文件的时候 结果是__main__
当__name__所在的文件是被导入文件时 结果是文件名(模块名)

可以借助__name__区分被导入的代码和测试代码
if __name__ == '__main__':
当前文件是执行文件的时候才会执行的子代码块

模块的查找顺序

'''
1.先从内存空间中查找
2.再从内置模块中查找
3.最后去sys.path查找
如果上述三个地方都找不到 那么直接报错

1.验证先从内存空间中查找
import md
import time
time.sleep(10) # 睡眠期间md文件删除
print(ma,name)
2.验证再从内置模块中查找
import time
print(time)
print(time.time())
3.验证sys.path
import sys
print(sys.path)
注意事项:
'''
在创建py文件的时候一定不要跟模块名冲突
sys.apth中虽然有很多路径 但是只需要重点关注第一个 第一个其实就是执行文件所在的路径
查找模块的时候只需要站在执行文件的路径查看即可
'''
如何解决
方式1:主动添加sys.path路径(类似于添加环境变量)
import sys
sys.path.append(文件路径)
import mod
print(mod)
'''
pycharm会自动将项目目录所在的路径添加到sys.path中
'''
方式2:利用from...import...句式指名道姓的查找
from qqq import mod # 从文件夹qqq中导入mod模块
print(mod.name)
from qqq.www.eee import mm # 通过点的方式进入下一层目录
print(mm.name)

绝对导入与相对导入

1.在导入模块的时候一切查找模块的句式都是以执行文件为准
无论导入的句式是执行文件还是被导入文件中

绝对导入
永远按照执行文件所在的路径一层层往下查找
相对导入
相当于导入只能在被导入文件中使用 不能在执行文件中使用
'''
.表示当前路径
..表示上一层路径
../..表示上上一层路径
'''

从专业的角度来解释的话
包就是内部含有__init__.py的文件夹
从实际的角度来解释的话
包就是多个模块的结合体(内部存放了多个模块文件)
在pycharm中甚至提供了创建包的选项
本质就是文件夹里面有一个__init__.py文件
'''
在导入包的时候 索要名字其实是跟包里面的__init__.py要
1.如果想直接通过包的名字使用包里面所有的模块 那么需要在__init__.py中提前导入
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
2.也可以直接忽略__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.requirement.txt文本文件
存放程序需要使用的第三方模块及对应的版本

ps:目录的名字可以不一致 但是主要的思想是一致的
就是为了便于管理 解耦合。。。
拿到文件之后直接运行即可 无需考虑程序内部的复杂程度 便于管理


 

 posted on 2022-03-25 22:25  鳗鱼的春天  阅读(33)  评论(0编辑  收藏  举报