@spiritnotes
2016-01-29T09:21:45.000000Z
字数 2305
阅读 2125
Python
与JAVA语言一样,Python中也有包的概念。Python中的包就是一个包含Python模块(就是python文件)的目录,作为与普通目录的区别,Python的包目录必须包含一个__init__.py的文件。包允许嵌套。
对于导入一个包有多种方法,我们依次来分析一下各种方法的差别。
#1 直接导入包
import testpkg
#2 导入包里面的具体模块
import testpkg.modulea
from testpkg import modulea
#3 使用*导入一个包
from testpkg import *
我们的包结构设计如下:
路径 | |
---|---|
test.py | |
testpkg | __init__.py |
modulea.py | |
moduleb.py |
先在每个文件中添加如下代码,用于查看不同导入执行的文件
print('excute file', __file__)
而测试的主执行文件,test.py中则输入如下代码:
import sys
base_modules = set(sys.modules.keys())
local_names = set(dir())
# 测试代码修改
import testpkg
now_modules = set(sys.modules.keys())
now_names = set(dir())
print('模块名增加', now_modules - base_modules)
print('变量名增加', now_names - local_names - set(['now_modules', 'local_names']))
测试代码如上所示,其执行结果如下:
excute file /home/spirit/文档/pkg/testpkg/__init__.py
模块名增加 {'testpkg'}
变量名增加 {'testpkg'}
可以看到执行import包实际上是执行了其中的__init__.py,而其中的模块文件是没有执行,执行调用模块,则会产生异常(testpkg.modulea)。
excute file /home/spirit/文档/pkg/testpkg/__init__.py
excute file /home/spirit/文档/pkg/testpkg/modulea.py
模块名增加 {'testpkg.modulea', 'testpkg'}
变量名增加 {'testpkg'}
excute file /home/spirit/文档/pkg/testpkg/__init__.py
excute file /home/spirit/文档/pkg/testpkg/modulea.py
模块名增加 {'testpkg.modulea', 'testpkg'}
变量名增加 {'modulea'}
代码修改后,可以看到其执行结果,可以看到其实际上只执行了初始化文件。
excute file /home/spirit/文档/pkg/testpkg/__init__.py
模块名增加 {'testpkg'}
变量名增加 set()
Python还支持在__init__.py文件中用一个__all__导入进行控制,在__init__.py中代码中添加如下代码:
__all__ = ['modulea', 'moduleb']
可以发现执行 import*导入时的结果与之前不一样,如下:
excute file /home/spirit/文档/pkg/testpkg/__init__.py
excute file /home/spirit/文档/pkg/testpkg/modulea.py
excute file /home/spirit/文档/pkg/testpkg/moduleb.py
模块名增加 {'testpkg', 'testpkg.moduleb', 'testpkg.modulea'}
变量名增加 {'modulea', 'moduleb'}
而其他导入方法均没有变化。
在我们平常的操作中,往往希望如下代码是可以运行的,这时就可以通过修改__init__.py,在里面加入相应的执行代码,直接import对应的模块或者递归import子包。需求不一样,实现控制的方式也多种多样。
import A
A.B.C.d()