包
1 包的定义
包就是一个包含有__init__.py文件的文件夹
2 包的作用
包是模块的一种形式,包是用来被当做模块导入的
不同于.py文件形式的模块,包可以使得其中内容较多的模块结构更清晰,便于设计者维护更新
3 包的使用
3.1 使用者
包的使用可以参照模块的使用方法
模块地址: https://www.cnblogs.com/achai222/p/12577776.html
3.1.1 设置环境变量
使用者需要将包放到与执行文件同一个文件夹或者
将包的路径加入环境变量才能进行导入
import sys
sys.path.append('/project') # 直接将项目的根目录加入环境变量
print(sys.path)
3.1.2 导入包的过程
# 1、产生一个名称空间
# 2、运行包下的__init__.py文件,将运行过程中产生的名字都丢到1的名称空间中
# 导入包时并不会导入包下所有的子模块与子包,只导入__init__中存在的名字
# 3、在当前执行文件的名称空间中拿到一个名字mmm,mmm指向1的名称空间
# import导入文件时,产生名称空间中的名字来源于文件,
# import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
3.1.3 导入包
包的使用和.py模块的使用基本相同
包的导入有import和from ... import ...两种
注意:
凡是在导入时带点的,点的左边都必须是一个包,否则非法
import a.b.c ----->a,b必须为包
from a.b.c import d ----->a,b必须为包
3.1.4 使用模块内名字
引用模块内名字时需要添加模块名+.+名字
使用时点的左边可以是包,模块,函数,类
import foo # 相当于导入foo下__init__.py
foo.f1()
foo.f2()
foo.f3()
from foo import f1
f1()
from foo import *
print(f1)
print(f2)
print(f3)
3.2 设计者
3.2.1 设置环境变量
环境变量是以执行文件为准备的,所有的被导入的模块或者说后续的其他文件
引用的sys.path都是参照执行文件的sys.path
import sys
sys.path.append('/project') # 直接将项目的根目录加入环境变量
print(sys.path)
sys.path.append(r'/Users/linhaifeng/PycharmProjects/s14/day21/aa')
3.2.2 绝对导入与相对导入
针对包内的模块之间互相导入,导入的方式有两种
3.2.2.1 绝对导入
绝对导入,以包的文件夹作为起始来进行导入
#pool下的__init__.py
from pool import versions
3.2.2.2 相对导入
相对导入:仅限于包内使用,不能跨出包(包内模块之间的导入,推荐使用相对导入)
.:代表当前文件夹
..:代表上一层文件夹
依此类推
#pool下的__init__.py
from . import versions
相对导入只能用from module import symbol的形式,import ..versions语法是不对的,且symbol只能是一个明确的名字
from pool import futures.process #语法错误
from pool.futures import process #语法正确
3.2.2.3 两种导入的区别
相对导入只能在包内部使用,不能跨出包,
用相对导入不同目录下的模块是非法的,所以相对导入仅限于包内模板彼此之间使用
而绝对导入是没有任何限制的,所以绝对导入是一种通用的导入方式
3.2.3 __all__控制导入
from package import * # 使用from ... import *形式导入时
__all__=['process','thread'] # 可以通过在__init__.py文件中为__all__赋值控制导入的所有变量