包
什么是包?
包是一种模块,但是本质上就是一个文件
与普通文件夹不同是就是其中包含一个__init__.py文件,叫初始化文件。这个文件作用是将该包下所有模块的与执行文件的导入关系写下来。从而使得import 包名,可以通过__init__.py文件import包下的所有模块名。
包的作用
包的作用就是从文件夹级别组织代码。目的是为了提高维护性。
什么时候应该使用包
之前我们将代码抽取成为函数(模块),即使做成py文件,一旦项目过大时候,就不能很好的管理模块,所以使用文件级别组织代码,这样减少结构上的混乱。
包的使用
import导入模块时发生了三件事情
1.创建名称空间
2.执行模块py文件,加在名称
3.在执行文件产生新的名称,指向模块的名称空间
创建包
创建一个包new->python package
使用包
既然包也是模块,那么使用方式就是一样的,使用import来导入bao
import 包名
在导入包的时候,由于包是一个文件夹,是不能被执行的,所以执行的其实包内__init__.py的文件,这个文件就表示这个包
__init__.py文件的作用就是导入该包下的所有模块,这样一来使用包的人,就会很简单,无需关注包内的文件结构,直接导入包就可以了,就能使用所有包中的功能。
__init__.py文件应该包含什么内容?
不应该包含任何业务逻辑,仅仅只用于导入包中的模块。
__init__文件的作用
我们说包也是一个文件所以内部原理同模块相同。但是包它是一个文件夹而不是一个py文件,导入包名实际上执行的_init__文件。
__init__的作用是初始包,初始化其实就是将包中需要提供给外界的模块同一导入打包在一起
用户导入了包,就能使用所有的功能
注意
__init__导入模快文件时,由于是作为模块导入,所以sys.path中并不包含模块所在目录,应该导入时指定报名。
包的嵌套
定义是包中有包
要使用子包中的内容,方法一致,在子包中的init中导入需要的内容,但是注意不管是不是子包,都是作为模块导入
所以sys.path中肯定不包含子包的路径,导入时需要从执行文件目录往下找
导入包时的注意事项
使用import导入模块时,可以同加点来访问下一层
import pack.subpack.module1
注意点的左边必须是包名
我们也可以使用from import 来导入
from pack.subpack import module1
注意 from import后面的内容不能加点,必须是一个明确的名字
相对导入与绝对导入
很多时候一个包内的模块需要相互调用对方的功能来完成操作。按照之前从执行文件的目录下一层一层导入模块是可以的。但是包名改变是,就需要将相关的模块的导入信息全部修改。
绝对导入就是以执行文件为关键,一层一层写导入关系,
而相对导入就是以导入文件根据,根据其上下级的关系来写入关系。这样可以使得导入方式的书写较为简单并提高了代码的扩展性。
注意点:相对导入只适用包这一级别,不可以达到执行文件级别,所以不能用于执行文件中
常见错误:
1、绝对导入没有从执行文件目录开始执行
2、在执行文件中使用相对导入
3.包中的相对导入跳出了顶层包(即到了没有__init__.py的文件夹下)