包是什么:
包是一种模块 但本质上就是一个文件夹
与普通文件夹的区别就是其中包含一个__init__.py文件
包的作用
包的作用就是从文件夹级别组织代码
目的是为了提高维护性
什么时候应该使用包
之前我们将代码抽取到模块中 从文件级别组织代码 但是如果模块比较多的情况下 结构依然混乱
此时我们就需要使用包来组织代码
包的使用:
创建一个包
右键 new->python package
使用包
既然包也是模块 那么使用方式就是一样的 使用import 来导入包
import 包名
init文件的作用:
在导入包时发生了什么?
包也是一种模块 所以内部原理是一样的
1.创建名称空间
2.执行模块中的代码
3.在执行文件中产生名称指向模块名称空间
但是现在包是一个文件夹而不是一个py文件
所以在导入包时 实际上执行的就是这init文件
好处:
如此一来我们可以使用init来把一个文件夹变成一个模块 这个模块的种类是包
总结:
init的作用是初始化包 初始化其实就是将包中需要提供给外界的模块统一导入 打包在一起 用户导入了包 就能使用所有的功能
注意点:
init 导入模块文件时 由于是作为模块导入 所以sys.path中并不包含 模块所在目录 所以应该导入时要指定包名
pack包下的init from pack import module import pack.module
另外
init文件在python2中是必须的 python3中可选的 但是建议都要有
包的嵌套:
subpack包下的 init文件 import pack.subpack.module4 使用import导入模块时 可以加点来访问下一层 import pack.subpack.module4 ==点的左边必须是包名== 用from导入 from pack.subpack import module4 ==import后面必须是一个明确的名字 不能加点
相对导入与绝对导入
相对导入:
相对于被导入模块的路径
相对导入只能用于包的内部模块之间互相导入
注意 建议不要超过三层
绝对导入:
从sys.path开始的完整路径称之为绝对导入
我们会发现
1 如果你的包的层级比较复杂 写起来很长
2 假如有一天 你需要修改包名 你需要将所有导入语句全改一遍
为了解决这两个文件 我们最好使用相对导入