包
什么是包?
-包是模块的一种形式,
把的本质是一个含有__init__.py
的文件的文件夹
为什么要用包??
--模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理、维护会越来越复杂,因此我们可以使用包来扩展模块的功能。
如何用?
导入包的三件事:
1.创建一个包的名称空间
2.由于包是一个文件夹,无法执行包,因此执行包下的__init__.py
文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于__init__.py
)
3.在当前执行文件中拿到一个名字aaa
,aaa
是指向包的名称空间的
导入包就是在导入包下的__init__.py
,并且可以使用以下两种方式导入:
-
import ...
-
from ... import...
绝对导入和相对导入:
相对导入:
-
.代表当前被导入文件所在的文件夹
-
..代表当前被导入文件所在的文件夹的上一级
-
...代表当前被导入文件所在的文件夹的上一级的上一级
绝对导入:
# aaa/.py
from aaa.m1 import func1
from aaa.m2 import func2
注意事项:
-
包内所有的文件都是被导入使用的,而不是被直接运行的
-
包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准),推荐使用相对导入
-
当文件是执行文件时,无法在该文件内用相对导入的语法,只有在文件时被当作模块导入时,该文件内才能使用相对导入的语法
-
凡是在导入时带点的,点的左边都必须是一个包,
import aaa.bbb.m3.f3
错误
练习
# m1.py
def f1():
print('from f1')
# m2.py
def f2():
print('from f2')
# run.py
import aaa
aaa.f1()
aaa.f2()
aaa.f3()
print(aaa.bbb)
# aaa/__init__.py
from .m1 import f1
from .m2 import f2
from .bbb.m3 import f3
from . import bbb