循环导入问题
# 两个文件彼此导入彼此
循环导入的时候极有可能出现某个名字还没有被创建就使用的情况导致报错
"""在以后的编程生涯中 尽量去避免出现循环导入的问题"""
如果确实需要循环导入 那么需要确保双方使用的名字都必须'提前定义好'
(一错再错的办法)
方式1:将导入模块的句式写在定义名字的下面
方式2:将导入模块的句式写在函数体代码内
判断文件类型
py文件可以被分为两种类型
1.执行文件
2.被导入文件
我们可以通过内置变量__name__来区分
当__name__所在的文件是执行文件的时候 结果是__main__
当__name__所在的文件是被导入文件时候 结果是文件名(模块名)
print(__name__)
可以借助于__name__区分被导入的代码和测试代码
if __name__ == '__main__':
当前文件是执行文件的时候才会执行的子代码块
"""
快捷输入
输入main之后按tab键即可
"""
模块的查找顺序
"""
1.先从内存空间中查找
2.再从内置模块中查找
3.最后去sys.path查找(类似于我们前面学习的环境变量)
如果上述三个地方都找不到 那么直接报错!!!
"""
# 在导入一个模块时,如果该模块已加载到内存中,则直接引用,否则会优先查找内置模块,然后按照从左到右的顺序依次检索sys.path中定义的路径,直到找模块对应的文件为止,否则抛出异常。sys.path也被称为模块的搜索路径,它是一个列表类型
绝对导入与相当导入
1.在导入模块的时候一切查找模块的句式都是以执行文件为准
无论导入的句式是在执行文件中还是在被导入文件中!!!
# 绝对导入
永远按照执行文件所在的路径一层层往下查找(无脑查找即可)
# 相对导入
相当导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可
from . import a
相对导入只能在被导入文件中使用 不能在执行文件中使用
"""
预备知识
.表示当前路径
..表示上一层路径
../..表示上上一层路径
"""
'''以后如果想一劳永逸 那么就只使用绝对导入即可'''
包
# 从专业的角度来解释的话
包就是内部含有__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.requirements.txt文本文件
存放程序需要使用的第三方模块及对应的版本
'''
ps:目录的名字可以不一致 但是主要的思想是一致的
就是为了便于管理 解耦合...
'''