博文配套视频课程:24小时实现从零到AI人工智能
init.py概念介绍
- 如果目录中存在该文件,该目录就会被识别为 module package ,否则仅仅是一个普通文件夹 (存储图片、CSV文件等)
- 目录中包含了 init.py 时,当用 import 导入该目录时,会执行 init.py 里面的代码
- all 关联了一个模块白名单列表,当执行 from xx import * 时,就会导入列表中的模块
- 在了解了 init.py 的工作原理后,应该能理解该文件就是一个正常的python代码文件。因此可以将初始化代码放入该文件中
简化模块导入操作
假设我们的模块包的目录结构如下
.
└── mypackage
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py
如果我们使用最直接的导入方式,将整个文件拷贝到工程目录下,然后直接导入,当然这个例子里面文件比较少,如果模块比较大,目录比较深的话,可能自己都记不清该如何导入。(很有可能,哪怕只想导入一个模块都要在目录中找很久)
from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22print
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32
init.py的价值
我们在mypackage目录下增加一个 init.py 文件来做一个实验,mypackage/init.py 里面加一个print,如果执行了该文件print就会打印输出
.
└── mypackage
├── __init__.py
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py
all 的作用
all 关联了一个模块列表,当执行 from xx import * 时,就会导入列表中的模块。我们将 init.py 修改为
# Python封装思想: 代码 --> 方法,属性 --> 类,变量,函数 --> py模块文件 --> 包 --> 项目
# py包下面必须要有一个__init__.py文件
# 加载此包就等同于加载__init__.py文件
import random
from oop.demo02 import show as sh
from oop.demo02 import Dog
from oop.demo02 import a
# 可以配置被外界加载的白名单
__all__ = ['sh',"Dog"]
# 可能a仅仅本模块时候, 因此白名单中没有配置a
print(a,random.randint(1,10))