Python 包(package)
在比较大型的项目中常常需要编写、用到大量的模块,此时我们可以使用包(Package)来管理这些模块。
(一)什么是包?
Python包,就是里面装了一个__init__.py文件的文件夹。
__init__.py文件(前后各有 2 个下划线‘__’)具有下面4个性质
1.它本身是一个模块;
2.这个模块的模块名不是__init__,而是这个包的名字,也就是装着__init__.py文件的文件夹的名字。
3.它的作用是将一个文件夹变为一个Python模块
4.它可以不包含代码,不过此时仅仅用import [该包]形式是什么也做不了的。所以一般会包含一些Python初始化代码,在这个包被import的时候,这些代码会自动被执行。
5.第4点所指的初始化代码类型一:批量导入我们需要用到的模块,这样我们就不用在用到的时候再一一导入,方便实用。
6.第4点所指的初始化代码类型二:如果我们要使用“from pacakge_1 import *”的形式导入一个模块里面的所有内容,则需在__init__.py中加上“all = [‘file_a’, ‘file_b’]”。其中,package_1下有file_a.py和file_b.py。
7.不建议在__init__.py中写类,以保证该py文件简单。
__all__是Python中的一个重要的变量,放在__init__模块中,用于指定此包(package)被import *时,哪些模块(module)会被import进当前作用域中。不在 __all__列表中的模块不会被其他程序引用。我们可以对 __all__进行重写。
__path__也是python中的一个常用变量,它是储存着当前包内的搜索路径的一个列表。默认情况下只有一个元素,即当前包(package)的路径。
Python包具有下面3个性质:
1.它实质上是一个文件夹;
2.该文件夹里面一定有__init__.py模块,其他的模块可以有也可以没有;
3.它的本质依然是模块,因此一个包里面还可以装其他的包。
(二)导入包
导入包的方法和导入模块比较类似,只不过由于层级比一般模块多了一级,所以多了一条导入形式:
1.import 包名[.模块名 [as 别名]]
2.from 包名 import 模块名 [as 别名]
3.from 包名.模块名 import 成员名 [as 别名]
我们在导入包的时候,实际上是导入了它的__init__.py文件文件。