Python __init.py__文件

参考链接:

http://www.cnblogs.com/tqsummer/archive/2011/01/24/1943273.html

http://www.2cto.com/kf/201204/129388.html

http://www.linuxidc.com/Linux/2013-07/87723.htm

http://www.cnblogs.com/BeginMan/p/3183629.html

Python import

Module是Python中一个重要的概念,常见的情况下,我们需要在py文件中调用另一个py文件的方法时,将事先写好的py文件拷贝到当前目录,执行import,或者在sys.path中添加事先写好py文件所在目录,然后import。这样的做法对于少数文件是可行,但程序数目多,目录层级复杂,就会比较麻烦。

类似于java的package一样将多个py文件组织起来,以便在外部统一调用和内部相互调用,这里就用到Python的包的概念。我们首先需要知道Python在执行import时执行什么操作,按照Python文档解释如下:

第1步,创建一个新的,空的module对象(它可能包含多个module);
第2步,把这个module对象插入sys.module中
第3步,装载module的代码(如果需要,首先必须编译)
第4步,执行新的module中对应的代码。

在执行第3步操作时,首先要找到module程序所在位置,其原理为:

如果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找。 PYTHONPATH可以视为系统的PATH变量一类的东西,其中包含若干个目录。如果PYTHONPATH没有设定,或者找不到m1.py,则继续搜索与python的安装设置相关的默认路径,在Unix下,通常是/usr/local/lib/python。在windows系统中一般是在Python安装目录下定义一个后缀名为.pth的文件,解释器会在该文件中查找是否有包含的模块。

事实上,搜索的顺序是:当前路径 (以及从当前目录指定的sys.path),然后是PYTHONPATH,然后是python的安装设置相关的默认路径。正因为存在这样的顺序,如果当前 路径或PYTHONPATH中存在与标准module同样的module,则会覆盖标准module。也就是说,如果当前目录下存在xml.py,那么执 行import xml时,导入的是当前目录下的module,而不是系统标准的xml。

了解上面这些内容后,我们可以先构建package,以普通module的方式导入,这样就可以直接访问此package中所有module。

Python 包(package)

python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。如果__init__.py文件不存在,这个目录就仅仅是一个目录,而不是包,就不能被导入或者包含其他模块和嵌套包。

原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从 xml 导入 dom )的时候,实际上导入了它的 __init__.py 文件。一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。我们可以如下组织package

Python __init.py__文件_第1张图片

这样,按照package的层次关系,就能正确调用module中的函数。

__init__.py文件(内容不为空时)

细心的用户会发现,有时在import语句中会出现通配符*,导入某个module中的所有元素,这是由于__all__变量将所有元素全部导入。若想限制某些模块导入可通过__init__.py文件实现。我们在subPack1的__init__.py文件中写__all__ = ['module_13', 'module_12', 'subPack2']
然后进入python
>>>from package1.subPack1 import *
>>>module_11.funcA()
Traceback (most recent call last):
  File "", line 1, in
ImportError: No module named module_11
也就是说,*导入时,package内的module是受__init__.py限制的。import会把注册在包__init__.py文件中子模块和子包导入到当前作用域中来,由于module_11不在init文件中,因此会出现上面报错。
好了,最后来看看,如何在package内部互相调用。
如果希望调用同一个package中的module,则直接import即可。也就是说,在module_12.py中,可以直接使用
import module_11
如果不在同一个package中,例如我们希望在module_21.py中调用module_11.py中的FuncA,则应该这样:
from module_11包名.module_11 import funcA


通俗来说:

python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。
那么,__init__.py还有什么别的功能呢?
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件
我们可以再__init__.py文件中再导入其他的包,或者模块。
[python]
import readers 
import writers 
import commands 
import users 
import meta 
import auth 
import admin 

这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。
不需要一个个去导入module了。
__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
from PackageName import *
这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:
#文件 __init__.py

__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]


你可能感兴趣的:(Python编程学习,python)