Python中module文件夹里__init__.py的功能
一般来说,需要引用python模块,可以用如下形式:
import xxx
import xxx as xx
from xxx import xx
比如我们引入numpy模块:
In [21]: import numpy
In [22]: numpy
Out[22]: <module 'numpy' from '/home/chia/anaconda2/lib/python2.7/site-packages/numpy/__init__.pyc'>
然后在输入numpy,实际上我们看到,module numpy的路径实际上是一个__init__.pyc
的文件。pyc文件是python编译器编译生成的字节码文件。通常py文件改动就会生成一个pyc,如果有pyc存在的话默认用pyc。
python module中的__init__.py
文件实际上是执行import命令时访问的文件。换句话说,init的py文件是一个module的指示器。如果一个文件夹里面有这个py文件,那么它就可以被视为一个包,通过import引入,如果没有,则无法引入。
如果我们自己写一些函数,想要当做一个python 的模块通过import导入的话,有两种方式。
一种是写成xxx.py
文件,然后通过from xxx import xfun
比如:
# this is util.py
def sayHello():
print "Hello"
然后在同一个文件夹中另一个文件中,调用这个模块
# this is main.py
from util import sayHello
这样是可行的。
如果写的函数比较多,而且又有不同类别的话,我们就需要把所有的文件和文件中的函数放在一个文件夹中了。那么,这个文件夹里面就要放一个空白的__init__.py
当然,我们说__init__.py
只要有就可以,但是它本身是一个py文件,因此可以在里面写一些语句。
比如一个较为重要的变量是 __all__
,它一般定义为module中的所有子文件。
比如一个文件夹叫做 utils
,其中有a.py, b.py
那么,__all__
就可以写成:
__all__ = ['a', 'b']
定义了这个all变量的好处是,我们在进行模糊引入的时候,即:
from utils import *
就可以将所有的子文件import进来,比如我们就可以引用utils.a
了。