当一个项目中有很多个模块时,需要再进行组织。将功能类似的模块放到一起,就形成了“包”
本质上,“包”就是一个必须有init.py 的文件夹。典型结构如下:
包(package)的概念和结构 - 图1
包下面可以包含“模块(module)”,也可以再包含“子包(subpackage)”。就像文件夹下面可以有文件,也可以有子文件夹一样:
包(package)的概念和结构 - 图2
上图中,a 是上层的包,下面有一个子包:aa。可以看到每个包里面都有init.py 文件。

init.py 的核心作用:

  1. 作为包的标识,不能删除。
    2. 用来实现模糊导入
    3. 导入包的实质是执行init.py 文件,可以在init.py 文件中做这个包的初始化、以及需要统一执行的代码。
    1. import pack1 # 意味着执行了包pack1下面的__init__.py 文件

包(package)的概念和结构 - 图3

导入与执行

想要导入module_AA.py,执行其中的fun()函数,有三种方法:

  1. import a.aa.module_AA
  2. a.aa.module_AA.fun() # 使用时加完整名称来引用
  3. from a.aa import module_AA
  4. module_AA.fun() # 使用时直接使用模块名
  5. from a.aa.module_AA import fun
  6. fun() # 使用时直接使用函数名

注:
1. from package import item 中,item可以是包、模块,也可以是函数变量
2. import item1.item2 这种语法中,item必须是包或模块,不能是函数类、变量

示例

【示例】测试init.py 文件的本质用法
包(package)的概念和结构 - 图4
a 包下的init.py 文件内容:

  1. import turtle import math
  2. '''批量导入'''
  3. print("导入 a 包")

在b 包下的module_B1.py 文件中:

  1. >>>import a
  2. >>>导入 a
  3. >>>print(a.math.pi)
  4. >>>3.141592653589793