导入包操作和本质
当一个项目中有很多个模块时,需要再进行组织。我们将功能类似的模块放到一起,形成了"包"。本质上,"包"就是一个必须有__init__.py的文件夹。且包下面可以再由包。
典型结构如下:
├─a
│ │ module_A.py
│ │ module_A2.py
│ │ module_A3.py
│ │ __init__.py
│ │
│ └─aa
│ │ module_AA.py
│ │ __init__.py
导入包操作和本质
我们需要导入 module_AA.py。方式如下:
1、import a.aa.module_AA 在使用时,必须加完整名称来引用。比如:a.aa.module_AA.fun_AA()
2、from a.aa import module_AA 在使用时,直接可以使用模块名。比如:module_AA.fun_AA()
3、from a.aa.module_AA import fun_AA 直接导入函数在使用时,直接可以使用函数名。 比如:fun_AA()
【注】:
1、from package import item 这种语法中,item可以是包、模块,也可以是函数、类、变量。
2、import item1,item2 这种语法中,item只能是包或模块,不能是其他。
init.py文件本质
导入包的本质其实是"导入了包的__init__.py"文件。也就是说,"import package"意味着执行了包package下面的__init__.py 文件。
这样,可以在__init__.py中批量导入我们需要的模块,而不再需要一个个导入。
如编辑a包下的__init__.py文件
import math
import time
当执行: import a,即已经批量导入了math和time模块了
__init__.py 的三个核心作用:
1、作为包的标识,不能删除。
2、用来实现模糊导入
3、导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及需要统一执行代码、批量导入。
用*导入包
import * 这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们。 这可能会花长时间等。Python解决方案是提供一个明确的包索引。
这个索引由 __init__.py文件中定义 __all__ 变量,该变量为一列表,
如上例a包下的 __init__.py 中,可定义 __all__ = ["module_A","module_A2"]
当执行:import a,即实际只导入了module_A和module_A2模块,module_A3模块是没有导入的
【注】尽管提供 import * 的方法,仍不建议在生产代码中使用这种写法。
包内引用
如果是子包内的引用,可以按相对位置引入子模块
如:
from .. import module_A #..表示上级目录
from . import module_A2 #.表示同级目录