每当我想搞透一个东西的时候,我就会写篇文章。OK,今天的主题就是这个__init__文件。
关于这个文件,问题无非是三个,是什么,为什么,怎么用。
是什么- python包管理
这个问题的核心在于python的包管理。
python使用包来组织模块的命名空间。A.B表名在A包中的B模块。主要用来解决全局变量名称冲突的问题。
为什么
来看一个典型的项目结构:
image.png
在导入一个包的时候,python搜索所有sys.path下面的目录。__init__.py文件用来告诉python,这个目录是一个python包。
这个机制防止某些通用名字的目录,例如string,和后续加载的实际可能的模块名发生冲突。
怎么用
import语句
最简单的情况下,__init__.py文件可以是空的。也可以执行初始化代码,或者设置__all__变量。
包的用户可以导入包中的单独的某个模块,例如:
import sound.effcts.echo
这会加载子模块sound.effcts.echo,使用时必须使用全名:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
另外一种导入包的方式是:
from sound.effects import echo
这也会加载子模块echo, 使用时不需要使用全名:
echo.echofi