在开发较大规模的Python工程时,通常需要进行模块化管理。把各种开发好的模块用文件夹的形式,放在同一目录下,最后统一调用。之前介绍过sys.path.append、importlib 和imp来解决复杂模块调用问题,但苦于都不够优雅。
今天介绍的__init__.py
较为优雅,博主推荐指数:★★★★★
我们以一个实验开始。假设我们开发好的模块,都封装到modules/
中,然后通过python文件main.py
调用。文件结构如下:
.
├── main.py
└── modules
├── compo.py
├── minus.py
└── sub_modules
└── add.py
main.py
中想调用add.py
、minus.py
和compo.py
中的函数,我们先看一下main.py
:
from modules import add
from modules import minus
from modules import compo
a = 3
b = 4
c = add(a, b)
print(c)
d = minus(a, b)
print(d)
e = compo(a, b)
print(e)
直接from modules import xxx
无差别import这几个模块,帅不帅?想不想学?
不着急,我们加两个__init__.py
即可。
.
├── main.py
└── modules
├── compo.py
├── __init__.py
├── minus.py
└── sub_modules
├── add.py
└── __init__.py
在这里我们加点难度,假设模块之间也是有相互引用的,比如compo.py
也引用了minus.py
和add.py
先看各个文件的内容:
add.py
:
def add(a, b):
return a + b
minus.py
:
def minus(a, b):
return a - b
compo.py
from . import add
from . import minus
def compo(a, b):
return 2 * add(a, b) + 10 * minus(a, b)
注意这个位置import的用法,只有当库用的.py才能进行from .
的import。
我们继续,先看sub_modules路径下的__init__.py
:(仅一行)
from .add import add
再看modules路径下的__init__.py
:(仅三行)
from .sub_modules import add
from .minus import minus
from .compo import compo
在这里,我们先下一个结论:
__init__.py的作用是把一个folder等效于一个.py文件。
理解了这句话就理解了__init__.py
该怎么写:
首先先从最底层的folder开始写,每个folder都含有一个__init__.py
,将其化解等效于一个python文件,再向上一级目录写__init__.py
。
本文为本人学习整理,如有不清楚的地方,欢迎留言交流~