一、什么是包
包就是一个包含有__init__.py文件,我们在创建包的目的就是为了用文件夹将文件/模块组织起来
创建包的目的不是为了运行,而是被导入使用。包只是模块的一种形式而已,包的本质就是模块
二、为什么使用包
包的本质就是一个文件夹,我们需要用文件夹将模块文件组织起来,以此来提高程序的结构性和维护性
三、包的导入语句
import
from...import...
1、无论是哪种,必须遵循一个原则,凡是在导入带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点。在导入后,使用就没有这个限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)
2、import导入文件时,产生名称空间中的名字来源于文件,import包,产生的名称空间的名字也来源于文件,即包下的__init__.py 导入包本质就是在导入该文件
3、包A和包B下有同名模块也不会冲突,如A.a与B.b来自两个命名空间
四、包的使用 from...import...
from之后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,比如:from a import b.c就是语法错误
五、绝对导入与相对导入
我们最顶级包glance是写给别人去用的,然后在glance包内部也会有彼此之间相互导入的需求,这时候就有绝对导入和相对导入两种方式
绝对导入:以glance作为起始
相对导入:用 . 或者 .. 的方式作为起始(只能在一个包中使用,不能用于不同目录)
六、包以及包所包含的模块都是用来被导入的,而不是被直接执行的,但是环境变量都是以执行文件为准
总结:相对导入和绝对导入
相对导入:
优点:执行文件与被导入的模块都可以使用
缺点:所有导入的都是以sys.path为起始点,导入比较麻烦
绝对导入:
符号: . 代表当前所在文件的文件夹,..代表上一级文件夹,...代表上一级的上一级文件夹
优点:导入更简单
缺点:只能在导入包中的模块时才能使用
注意: 1. 相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内 2. attempted relative import beyond top-level package # 试图在顶级包之外使用相对导入是错误的,
言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包