什么是包?

 包是一种模块,但是本质上就是一个文件

与普通文件夹不同是就是其中包含一个__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的文件夹下)

原文地址:https://www.cnblogs.com/msj513/p/9780626.html