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