包
概念
包是一种通过使用.模块名来组织python模块名称空间的方式。
导入包的本质
import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py文件,导入包本质就是在导入该文件
注意事项
- 在导入语句中包含有
.,说明是包导入。
- 包是目录级的,包是一种包含
__init__.py文件的目录。
- import导入文件时,产生名称空间中的名字来源于文件;import导入包,产生的名称空间的名字同样来源于文件,即包下的
__init__.py文件,导入包本质就是在导入该文件。
- 在python3中,即使包下没有
__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import导入包报错。
- 创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包即模块。
- 凡是在导入时带
.的,.的左边都必须是一个包,否则非法。可以带有一连串的.,但都必须遵循这个原则。
- 对于导入包之后,
.的左边可以是包,模块,函数,类等,它们都可以用.的方式调用自己的属性。
- 对比
import item 和from item import name,如果想直接使用name则必须使用后者的导入方式。
包的使用
import用法
1 2 3 4
|
import package.nextpackage.models package.nextpackage.models.models_function('func_1')
|
from … import …用法
1 2 3 4 5 6 7 8 9 10
|
from package.nextpackage import models models.models_function('func_1')
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
| import package package.nextpackage.models.models_function()
>>> AttributeError: module 'package' has no attribute 'nextpackage'
from . import nextpackage
from . import models
import package package.nextpackage.models.models_function()
|