在前面章节老猿介绍了包下模块及子包的加载的各种方式,并说明包的加载首先是自动加载包下的__init__.py文件。在​​《第10.6节 Python包的概念》​​中介绍了__init__.py文件的作用主要用于包内模块的加载,那么使用__init__.py来加载包的模块有什么好处呢?

我们先来看例子,下面例子还是以​​《第10.7节 Python包的和子包定义步骤》​​中规划的包为基础来介绍的,本节唯一的变化是包goodspricequery的__init__.py增加了两行增加注释的内容,如下:

#package goodspricequery's __init__.py '''package goodspricequery is a example of module and package,inculding: 1.subpackage:dataaccess 2.module:mainwin ''' print('Start loading packeg:goodspricequery ...') goodspricequeryloaded=True dataaccessloaded=False  from goodspricequery.dataaccess import  * #增加导入包下子包 from  goodspricequery.mainwin import    * #增加导入包下模块  input('Package goodspricequery loaded!Press Enter to exit.')。 

我们执行包goodspricequery的加载:

>>> import goodspricequery Start loading packeg:goodspricequery ... Start loading dataaccess package ... Package dataaccess loaded! Module:mainwin start load... Module:mainwin loaded. Package goodspricequery loaded!Press Enter to exit. >>> goodspricequery.mainwin() I'm mainwin >>> goodspricequery.dataaccessloaded True >>> 

执行截图:

第10.10节 Python使用__init__.py自动加载包下内容_python

从上述执行来看,通过包的__init__.py使用import *加载的包下和子包下的模块成员,都可以通过“包名.成员”方式进行访问,这样对外提供能力时,调用者无需关注提供能力的模块是哪个,相关功能都认为是包的功能,此时的包对调用者来说就跟一个独立的模块文件一样。

类似的,凡是导入后属于调用者无需加包名和模块名就可以访问的导入方法如“from 包名.模块名 import 成员 ”、“import 包名.子包名.模块名 as 模块别名”等,相关的导入模块属性或模块本身都可以通过“包名.”方式访问。

本节介绍的通过包的__init__.py特定的导入方法导入的内容,都可以通过”包名.”方法访问,而无需关注相关属性的模块文件或子包文件,体现了一个包作为一个整体提供服务的能力。