大家在自己写自己的python包或者模块的时候都会碰到一个问题:要不要在包的文件夹内加一个空的或者有内容的__init__.py文件?有人说要,有人说python3.3以后不需要了。到底需要不需要呢?
对于小白,可以认为:python3.3以后不需要__init__.py了。但是这个表达不够精确。准确来讲,是python3.3以后不需要空的__init__.py了。如果你一定需要只能具体某些模块被包含进这个包,而不是所有的模块都包含进这个包,那么必须加__init__.py来指定。
除此之外添加__init__.py的好处还有这些。
此外的此外,添加__init__.py的好处还有:一般当你用import倒入一个包的时候,它的子包不会被自动导入,除非你在__init__.py里显式地import 一下。举例如下:
$ mkdir -p a/b
$ touch a/b/c.py
这命令行输入python
打开交互式python界面:
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ⇒ <module 'a.b' (namespace)>
a.b.c ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>
单独import a 不会自动导入a.b.c。但是单独import a.b.c会自动导入父包a和a.b。
但是一旦你在a这个文件夹下新建__init__.py并且写入
import b
这时候
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ <module 'b' (namespace)>
Reference
- https://stackoverflow.com/questions/37139786/is-init-py-not-required-for-packages-in-python-3-3