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