包的详解
包
一、包是什么
包的本质也是模块,可以理解为内部含有很多模块的模块,这就是包了。在Python2中,包下必须含有__init_的模块才可以成为包,但是在Python3中即便是没有_init,也会被默认为包。
二、导入包
2.1 使用情况:1%
首先声明,这种情况的包主要是设计者制作出来一些功能给使用者使用的,就像time模块,我们不需要知道其内部到底是什么结构,只需要知道我们导入这个模块,使用特定的调用方式可以使用其内部的某些功能。
包是模块的一种,在我们导入模块的时候发生的事在导入包的时候也会发生。但是有那么一点不太一样。
- 执行包下一级的__init__文件
- 产生一个名称空间用于存放__init__执行过程中产生的名称
- 在当前空间产生一个名称指向该包的init空间。
要明白,导入包并不是直接把包全部导入,而只是执行了_init__文件,并产生init 的名称空间,_init.py相当于包内中转站,提供了接口给外部调用者使用。所以一些包内的模块导入的信息都存放在init中,外界使用者只需要导入包调用init就可以了。
而在包下一级的init文件内部导入包内其他功能可以使用import或者from..import语法.
这样,使用者并不需要导入其他额外的东西,设计者在设计包的时候都考虑到了,将其放到了init里面。
2.2 包的两种导入
包的导入有两种:
-
绝对导入:导入其他模块的起始位置都要从顶级包开始向下写。
-
相对导入:导入其他模块是从当前模块开始。一个点代表当前位置。两个点代表返回上一级。
针对上述结构,如果我想使用foo或者foo内部的某些功能。
# 使用者的py文件内部的代码
import aaa # 相当于执行了其下一级的__init__。
# init内部的代码可以用两种方式。
# 绝对导入
from aaa.bbb import foo
from aaa.bbb.foo import x
# 相对导入
from .bbb import foo
from .bbb.foo import x
要注意的点:
- 相对导入只能在包内部使用,也是最适合在包内使用的导入方式。
- import或者from..import语法中,只要是带点的,点的左侧必须是包。
2.2 使用情况:99%
大都情况下,包都是我们自己用来做项目什么的,而且在python3中,不带init也可以是包,在不同项目之间的使用主要是用我们上一章节讲到的模块间的导入。