1、什么是包?
包: 就是一个文件夹
2、包和文件夹区别
- 在python3以前,包中是有一个文件__init__.py,没有该文件的就是一个普通的文件夹,有该文件的才是包;
- 在python3以后,不管有没有,都认为是一个包。
3、创建包
创建包步骤
4、使用包中模块成员
① 使用import方式导入模块
示例
第一步:新建包(nurmal_dir)并在包中新建模块(a.py)
n = 1
第二步:调用模块a.py中成员
import nurmal_dir.a
print(nurmal_dir.a.n)
######结果######
1
别名形式
import nurmal_dir.a as x
print(x.n)
######结果######
1
② 使用from-import方式导入模块
从包中导入模块,使用时需要模块名.成员名来调用成员
示例
第一步:新建包(nurmal_dir)并在包中新建模块(a.py)
n = 1
第二步:调用模块a.py中成员
from nurmal_dir import a
print(a.n)
######结果######
1
如果想直接使用成员,可以使用from 模块名.模块名 import *
from nurmal_dir.a import *
print(n)
######结果######
1
5、可以直接导入到包位置??
示例
import nurmal_dir
print(nurmal_dir.a.n)
######结果######
报错
通过结果说明:如果只导到包的位置,那么通过这个包去找这个模块时,会报错。因为不确定要导入哪个模块。
如何解决呢??
答: 需要在包中的__init__.py中,告诉解释器,当导入包时,应该导入哪些模块。
在包中__init__.py中写入如下代码:
from . import a # .是当前目录
再次导入包
import nurmal_dir
print(nurmal_dir.a.n)
######结果######
1
通过结果说明:当在使用import方式或from-import方式导入包时,需要在__init__.py文件中,明确的指出可以被导入的模块有哪些(使用from . import 模块名 形式指定)。如果在该文件中没有指定可以导入的模块时,默认不导入任何模块。
6、拓展
还可以在__init.py模块中使用__all__,但是这种方式不通用。只能用在from 包名 import *导入所有模块的情况,通过这个__all__可以来设置哪个模块可以被导入。
第一步:创建包(normal_pack)在包中创建a.py模块和b.py模块
a.py
n = 1
b.py
m = 2
第二步:在init.py中输入以下代码
__all__ = ["a"]
第三步:导入模块
from normal_pack import *
print(a.n)
######结果######
1
如果使用b.m就会出错,__init__模块中__all__方法没有添加b模块。
7、包导入方式小结
| 导入方式 | 使用方式 |
|---|---|
| import 包名.模块名 | 包名.模块名.成员 |
| from 包名.模块名 import 成员 | 直接使用成员 |
| from 包名 import 模块名 | 模块名.成员 |
| from 包名.模块名 import * | 直接使用成员 |