包
包的本质就是一个文件目录.
目录只有包含一个叫做 init.py 的文件才会被认作是一个包。
目录中存放了一个或多个.py模块.
包的介绍:
在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包和包中含有的子目录。
如果包定义文件 init.py 存在一个叫做 all 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。
all = [“模块名1”, “模块名2”, “模块名3”]
导入包
包的导入仍使用 import 、 from … import 语句,使用 “圆点模块名” 的结构化模块命名空间。 下面来看一个包的例子来了解下具体的运作。(官方文档中的例子)
假设你现在想要设计一个模块集(一个“包”)来统一处理声音文件和声音数据。存在几种不同的声音格式(通常由它们的扩展名来标识,例如: .wav, .aiff, .au )于是,为了在不同类型的文件格式之间转换,你需要维护一个不断增长的包集合。可能你还想要对声音数据做很多不同的操作(例如混音,添加回声,应用平衡 功能,创建一个人造效果)所以你要加入一个无限流模块来执行这些操作。你的包可能会是这个样子(通过分级的文件体系来进行分组):
1.用户可以每次只导入包里的特定模块,例如:
import sound.efforts.echo
这样就导入了
sound.effects.echo
子模块。它必须通过完整的名称来引用:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
导入包时有一个可以选择的方式:
from sound.effects import echo
这样就加载了 echo 子模块,并且使得它在没有包前缀的情况下也可以使用,所以它可以如下方式调用:
echo.echofilter(input, output, delay=0.7, atten=4)
还有另一种变体用于直接导入函数或变量:
from sound.effects.echo import echofilter
这样就又一次加载了 echo 字模块,但这样就可以直接调用它的 echofilter() 函数:
echo.echofilter(input, output, delay=0.7, atten=4)
需要注意的是
from package import item
方式导入包时,这个子项(item)既可以是子包也可以是其他命名,如函数、类、变量等。若无,会引发ImportError异常。
而用类似
import item.subitem.subsubitem
这样的语法时,这些子项必须是包,最后的子项可以是包或模块,但不能是类、函数、变量等。
2.如果main.py想要引用packagea中的模块modulea1,可以使用:
from package_a import module_a1
import package_a.module_a1
如果packagea中的modulea1需要引用packageb,那么默认情况下,python是找不到packageb。我们可以使用sys.path.append(’…/’),可以在packagea中的__init__.py添加这句话,然后该包下得所有module都添加* import __init_即可。