Python包

概念

包是一种通过使用.模块名来组织python模块名称空间的方式。

导入包的本质

import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py文件,导入包本质就是在导入该文件

注意事项

  • 在导入语句中包含有.,说明是包导入。
  • 包是目录级的,包是一种包含__init__.py文件的目录。
  • import导入文件时,产生名称空间中的名字来源于文件;import导入包,产生的名称空间的名字同样来源于文件,即包下的__init__.py文件,导入包本质就是在导入该文件。
  • 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import导入包报错。
  • 创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包即模块。
  • 凡是在导入时带.的,.的左边都必须是一个包,否则非法。可以带有一连串的.,但都必须遵循这个原则。
  • 对于导入包之后,.的左边可以是包,模块,函数,类等,它们都可以用.的方式调用自己的属性。
  • 对比import itemfrom item import name,如果想直接使用name则必须使用后者的导入方式。

包的使用

import用法

1
2
3
4
# 测试python文件与包同目录

import package.nextpackage.models
package.nextpackage.models.models_function('func_1')

from … import …用法

1
2
3
4
5
6
7
8
9
10
# 注意:from ... import ... 中import后面必须是类、方法等,且不能包含点(.)

# 测试python文件与包同目录
# 1、导入某个模块
from package.nextpackage import models
models.models_function('func_1')

# 2、导入模块中的某个方法
from package.nextpackage.models import models_function
models_function('func_1')

__init__.py文件

不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件,这个文件可以为空,也可以进行一些初始化的工作。

from ... import *用法

  • from ... import *意在导入包中所有类、方法等,实际上该语句只会导入包下__init__.py文件中定义的名字,我们可以在这个文件中定义__all__变量

绝对导入和相对导入

  • 绝对导入:以项目根路径作为起始
  • 相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
1
2
3
4
5
6
7
8
9
10
11
# 文件路径
package/nextpackage/models.py


# 绝对导入
from package.nextpackage import models
models.models_function()

# 相对导入
from ..nextpackage import models
models.models_function()

单独导入包

  • 单独导入包名称时不会导入包中所有包含的所有子模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试python文件与包同目录,在py程序中直接引入方法
import package
package.nextpackage.models.models_function()
# 输出报错
>>> AttributeError: module 'package' has no attribute 'nextpackage'

# 解决方法
#package/__init__.py
from . import nextpackage

#package/nextpackage/__init__.py
from . import models

# 执行结果
# 测试python文件与包同目录
import package
package.nextpackage.models.models_function()