[关闭]
@spiritnotes 2016-01-29T09:21:45.000000Z 字数 2305 阅读 1961

Python语言实践分析 -- 包导入

Python


Python中的包

与JAVA语言一样,Python中也有包的概念。Python中的包就是一个包含Python模块(就是python文件)的目录,作为与普通目录的区别,Python的包目录必须包含一个__init__.py的文件。包允许嵌套。
对于导入一个包有多种方法,我们依次来分析一下各种方法的差别。

  1. #1 直接导入包
  2. import testpkg
  3. #2 导入包里面的具体模块
  4. import testpkg.modulea
  5. from testpkg import modulea
  6. #3 使用*导入一个包
  7. from testpkg import *

实践

我们的包结构设计如下:

路径
test.py
testpkg __init__.py
modulea.py
moduleb.py

先在每个文件中添加如下代码,用于查看不同导入执行的文件

  1. print('excute file', __file__)

而测试的主执行文件,test.py中则输入如下代码:

  1. import sys
  2. base_modules = set(sys.modules.keys())
  3. local_names = set(dir())
  4. # 测试代码修改
  5. import testpkg
  6. now_modules = set(sys.modules.keys())
  7. now_names = set(dir())
  8. print('模块名增加', now_modules - base_modules)
  9. print('变量名增加', now_names - local_names - set(['now_modules', 'local_names']))

1 直接导入包

测试代码如上所示,其执行结果如下:

  1. excute file /home/spirit/文档/pkg/testpkg/__init__.py
  2. 模块名增加 {'testpkg'}
  3. 变量名增加 {'testpkg'}

可以看到执行import包实际上是执行了其中的__init__.py,而其中的模块文件是没有执行,执行调用模块,则会产生异常(testpkg.modulea)。

2 导入模块

  1. excute file /home/spirit/文档/pkg/testpkg/__init__.py
  2. excute file /home/spirit/文档/pkg/testpkg/modulea.py
  3. 模块名增加 {'testpkg.modulea', 'testpkg'}
  4. 变量名增加 {'testpkg'}
  1. excute file /home/spirit/文档/pkg/testpkg/__init__.py
  2. excute file /home/spirit/文档/pkg/testpkg/modulea.py
  3. 模块名增加 {'testpkg.modulea', 'testpkg'}
  4. 变量名增加 {'modulea'}

3 import * 导入

代码修改后,可以看到其执行结果,可以看到其实际上只执行了初始化文件。

  1. excute file /home/spirit/文档/pkg/testpkg/__init__.py
  2. 模块名增加 {'testpkg'}
  3. 变量名增加 set()

4 __all__控制

Python还支持在__init__.py文件中用一个__all__导入进行控制,在__init__.py中代码中添加如下代码:

  1. __all__ = ['modulea', 'moduleb']

可以发现执行 import*导入时的结果与之前不一样,如下:

  1. excute file /home/spirit/文档/pkg/testpkg/__init__.py
  2. excute file /home/spirit/文档/pkg/testpkg/modulea.py
  3. excute file /home/spirit/文档/pkg/testpkg/moduleb.py
  4. 模块名增加 {'testpkg', 'testpkg.moduleb', 'testpkg.modulea'}
  5. 变量名增加 {'modulea', 'moduleb'}

而其他导入方法均没有变化。

5 __init__.py控制

在我们平常的操作中,往往希望如下代码是可以运行的,这时就可以通过修改__init__.py,在里面加入相应的执行代码,直接import对应的模块或者递归import子包。需求不一样,实现控制的方式也多种多样。

  1. import A
  2. A.B.C.d()

总结

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注