包的详解

一、包是什么

包的本质也是模块,可以理解为内部含有很多模块的模块,这就是包了。在Python2中,包下必须含有__init_的模块才可以成为包,但是在Python3中即便是没有_init,也会被默认为包。

二、导入包

2.1 使用情况:1%

首先声明,这种情况的包主要是设计者制作出来一些功能给使用者使用的,就像time模块,我们不需要知道其内部到底是什么结构,只需要知道我们导入这个模块,使用特定的调用方式可以使用其内部的某些功能。

包是模块的一种,在我们导入模块的时候发生的事在导入包的时候也会发生。但是有那么一点不太一样。

  1. 执行包下一级的__init__文件
  2. 产生一个名称空间用于存放__init__执行过程中产生的名称
  3. 在当前空间产生一个名称指向该包的init空间。

要明白,导入包并不是直接把包全部导入,而只是执行了_init__文件,并产生init 的名称空间,_init.py相当于包内中转站,提供了接口给外部调用者使用。所以一些包内的模块导入的信息都存放在init中,外界使用者只需要导入包调用init就可以了。

而在包下一级的init文件内部导入包内其他功能可以使用import或者from..import语法.

这样,使用者并不需要导入其他额外的东西,设计者在设计包的时候都考虑到了,将其放到了init里面。

2.2 包的两种导入

包的导入有两种:

  1. 绝对导入:导入其他模块的起始位置都要从顶级包开始向下写。

  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

要注意的点:

  1. 相对导入只能在包内部使用,也是最适合在包内使用的导入方式。
  2. import或者from..import语法中,只要是带点的,点的左侧必须是包。

2.2 使用情况:99%

大都情况下,包都是我们自己用来做项目什么的,而且在python3中,不带init也可以是包,在不同项目之间的使用主要是用我们上一章节讲到的模块间的导入。

模块详解:[https://www.cnblogs.com/liqianxin/p/12584399.html]

posted @ 2020-03-29 17:46  小菜鸟是我  阅读(369)  评论(0编辑  收藏  举报