包
概念
包是一种通过使用.模块名
来组织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()
|