__init__.py和__all__的作用
经常在Python工程的源代码目录中发现__init__.py这样一个文件,那么这个文件发挥着怎样的作用呢?本文主要总结__init__.py在Python工程中发挥的作用。
1. __init__.py的作用
__init__.py在进行包(Packages)导入的过程中发挥重要作用,可以极大的降低包导入的复杂度,并且包含__init__.py文件的目录会自动被识别为Python的包,而不包含__init__.py文件的目录仅是一个普通目录。
对于下面的代码结构,我们分别演示无__init__.py文件和有__init__.py文件时的功能模块导入过程。该工程中包含两个模块(moduleA和moduleB),每个模块中都包含两个子模块(subModule1和subModule2),每个子模块中都有一个功能的具体实现。
1.1 无__init__.py时的包导入过程
我们首先来看无__init__.py文件时的包导入过程。
在没有__init__.py时,如果我们需要在main.py文件中导入子模块中的功能,需要通过下面的方式导入:
# 导入funcAdd()功能
from moduleA.subModule1.funcAdd import funcAdd
也就是需要逐层的遍历需要导入的那个模块所在的目录,才能最终导入目标功能模块。若是目标功能模块在代码目录中嵌套的比较深,导入起来就比较麻烦,需要知道目标功能在整个代码目录中的嵌套关系。
1.2 有__init__.py时的包导入过程
我们在moduleA目录中新建__init__.py文件,并在填写如下内容
from .subModule1.funcAdd import funcAdd
这个时候同样是在main.py中导入funcAdd()功能,仅需如下方式就可以
from moduleA import funcAdd
1.3 总结
__init__.py发挥了接口封装的作用,可以通过__init__.py将需要呈现的接口暴露给上一层,从而避免复杂的导入过程。
2. __all__的作用
__all__起到了在模块导入时起到了限制作用,若模块中定义了__all__,在使用from module import *进行导入时,仅__all__中指定的成员可以被导入。