包
目录
- 包
- 前言
- 一、导入包
- 二、从*导入包
前言
包(pakcage):包含多个python文件/模块的文件夹,并且文件夹中有一个名称为__init__.py的特殊声明文件,那么这个文件夹就是一个包(模块包),可以将大量功能相关的python模块包含起来统一管理,同样也可以被其他模块通过import关键字引入重复使用封装的模块和代码!
为了组织好模块,会将多个模块分为包。Python 处理包也是相当方便的。简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件。
常见的包结构如下:
最简单的情况下,只需要一个空的 init.py 文件即可。当然它也可以执行包的初始化代码,或者定义稍后介绍的 all 变量。当然包底下也能包含包,这和文件夹一样,还是比较好理解的。
一、导入包
包的导入仍使用 import 、 from … import 语句,使用 “圆点模块名” 的结构化模块命名空间。 下面来看一个包的例子来了解下具体的运作。(官方文档中的例子)
假设你现在想要设计一个模块集(一个“包”)来统一处理声音文件和声音数据。存在几种不同的声音格式(通常由它们的扩展名来标识,例如: .wav, .aiff, .au )于是,为了在不同类型的文件格式之间转换,你需要维护一个不断增长的包集合。可能你还想要对声音数据做很多不同的操作(例如混音,添加回声,应用平衡 功能,创建一个人造效果)所以你要加入一个无限流模块来执行这些操作。你的包可能会是这个样子(通过分级的文件体系来进行分组):
二、从*导入包
import * 这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们。这可能会花长时间,并出现边界效应等。Python 解决方案是提供一个明确的包索引。
这个索引由 init.py 定义 all 变量,该变量为一列表,如上例 sound/effects 下的 init.py 中,可定义 all = [“echo”,“surround”,“reverse”]
这意味着, from sound.effects import * 会从对应的包中导入以上三个子模块; 尽管提供 import * 的方法,仍不建议在生产代码中使用这种写法。
包内引用:
如果是子包内的引用,可以按相对位置引入子模块 以 echo 模块为例,可以引用如下:
1 from . import reverse # 同级目录 导入 reverse
2 from … import frormats # 上级目录 导入 frormats
3 from …filters import equalizer # 上级目录的filters模块下 导入 equalizer