包的基础使用

一、什么是包

包就是一个包含有__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 # 试图在顶级包之外使用相对导入是错误的,
   言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包
原文地址:https://www.cnblogs.com/zhangzhechun/p/10300881.html