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__赋值控制导入的所有变量
原文地址:https://www.cnblogs.com/achai222/p/12592591.html