一、什么是包?
包是模块的一种形式,包的本质就是一个含有.py
的文件的文件夹。
在后面的介绍中,
二、为什么要有包?
模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理、维护会越来越复杂,因此我们可以使用包来扩展模块的功能。
三、模块和包
模块就是一个.py文件
包就是一个文件夹,其中含有__init__.py
的文件
导入模块发生的三件事:
- 创建一个包的名称空间
- 执行py文件,将执行过程中产生的名字存放于名称空间中。
- 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
导入包发生的三件事:
- 创建一个包的名称空间
- 由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于.py)
- 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
四、如何用包
记住,一个包就代表包含了更多的模块,更多的函数,更多的功能。
包中的__init__.py
文件,就相当于在管理包中的各个模块,各个功能。告诉用户如何使用包。如何导入,包中有哪些方法可以使用。就好像C中的Makefile脚本文件类似。
创建包
画重点:这里主要介绍的是自定制的包,因为第三方的包都在环境变量下,直接可以通过包名进行import导入。而自定制的包,实际上就是自己写的包。
流程:
-
首先,在要从创建的目录下创建
package Test
文件夹,文件夹中包括__init__.py
文件 -
然后再文件夹下去创建
m1.py
和m2.py
-
# m1.py def func1(): pass def func2(): pass def func3(): pass
-
# m2.py def func4(): pass def func5(): pass def func6(): pass
修改_init_.py文件
首先要说一下 相对导入 和 绝对导入 的问题。
之前说了__init__.py
文件就好像包中的一个管理工具,它告诉别人包中的哪些模块功能可以被直接调用。因此,就需要通过导入的方式,把模块中的功能先导入到__init__.py
文件中,别人在导入该包,使用包中功能时就可以直接使用。因为,实际上在使用包进行导入时就是在导入__init__.py
文件。导包就是导入__init__.py
文件
绝对导入
from 文件目录名/模块名 import 函数名
导入指定目录下模块中的某个功能函数
from 文件目录名/模块名 import *
导入指定目录下模块中的全部功能函数
相对导入
- .代表当前被导入文件所在的文件夹
- ..代表当前被导入文件所在的文件夹的上一级
- ...代表当前被导入文件所在的文件夹的上一级的上一级
from ./模块名 import 函数名
导入当前目录下模块中的某个功能函数
from 文件目录名/模块名 import *
导入模块中的全部功能函数
导入包
在导包之前,首先要查看环境变量。要导入的自定制的包是否在环境变量下
导包就是导入__init__.py
文件,并且可以使用以下两种方式导入:
- import ...
- from ... import...
包, 就是把一个模块分成多个文件存储,但还是和模块同样的导入方式进行导入即可。
需要导入什么功能,就去导入什么功能。使用者感觉不到变化