Python中的模块和包是比较重要的概念。
模块是去掉.py扩展名的Python文件,比如myModule.py是Python文件,myModule是模块,在其他python文件中可以通过import myModule的方式导入模块,并使用导入的模块所定义的各种对象,包括类、函数以及变量等等。
模块是一个比较简单的概念,用起来也比较容易,读者如果感兴趣可以上网搜索,这里我重点介绍一下包的概念。
包是组织多个具有关联的模块的文件夹,在Python中,包与一般文件夹的区别是包目录下有一个__init__.py的文件,这个文件内容可以为空,也可以具有内容,它的作用是指示该文件夹是一个python包。
下面就以实例的方式讲解一下包:
下面是一个树形结构:
package1
------__init__.py
------subPack1
------__init__.py
------module_11.py
------module_12.py
------module_13.py
------subPack2
------__init__.py
------module_21.py
------module_22.py
其中package1、subPack1、subPack2均为包,module_11、module_12、module_13、module_21、module_22均为模块。
在module_11.py中定义一个函数funcA:
def funcA():
print "funcA in module_11"
return
在python解释器中导入函数funcA
>>> from package1.subPack1.module_11 import funcA
>>> funcA()
funcA in module_11
或者导入包中的模块module_11
>>> from package1.subPack1 import module_11
>>> module_11.funcA()
funcA in module_11
注意:导入模块时,调用模块中的对象需要用到.符号,即模块.对象,以限定对象的范围
也许大家经常会发现,导入对象可以为通配符*。
>>> from package1.subPack1 import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> module_11.funcA()
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
module_11.funcA()
NameError: name 'module_11' is not defined
我们通过dir命令查看到没有导入任何模块,而且使用module_11.funcA()后执行失败,提示module_11没有定义。
这里的玄机在于包中文件__init__.py中的__all__变量的内容,__all__中可以指定在使用通配符*导入时可以导入哪些模块。
我们在subPack1中的__init__.py文件中定义__all__变量的内容:
__all__=['module_11']
然后在解释器中导入通配符*
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> from package1.subPack1 import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'module_11']
>>> module_11.funcA()
funcA in module_11
从上面的步骤可以看出,只有变量__all__中指定的module_11被导入了,而没有指定的module_12和module_13没有被导入。