第七章、包、模块
一、包
-
包就是带有
__init__.py
的文件夹 -
包和模块的命名,包的名字就是文件夹的名字,文件的名字就是模块的名字
-
若存在两个相同的模块,但是模块的包不相同,而名字相同,那么就需要用包名.模块名来调用模块
-
seven.c4 six.c4
- 包下面可以有子包
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DtPW4nN-1604139155786)(C:\Users\zhf28\Desktop\学习笔记\Python笔记\python笔记\第7章\img\1.png)]
- 在python中要想成为包,就必须有
__init__.py
[^1],这个模块可以什么都不写,但是必须存在,才能表示该文件夹是包
- 在python中要想成为包,就必须有
二、模块的导入
-
在别的模块中调用某个变量,如果不调用,则会报错
-
导入模块的两种方式:
import
[2]和`from`[4]
-
import ccc1 print(ccc1.a) # 结果: 10
- 若模块在包中,导入格式是
包名.模块名
-
import son_bag.ccc11 print(son_bag.ccc11.a) # 结果: 10
-
不能直接导入模块下的变量
-
简化路径用
as
[^3]
-
import son_bag.ccc11 as m print(m.a) # 结果: 10
-
导入包中的模块的变量 from son_bag.ccc11 import a print(a) 结果: 100
-
# 导入包中的模块 from son_bag import ccc11 print(ccc11.a) # 结果: 100
-
# 当包中存在多个变量或,想要导入多个数据时,导入方式 from son_bag.ccc11 import * print(a,end=" ") print(b,end=" ") print(c,end=" ") print(d,end=" ") # 运行结果 100 20 30 40
-
# 指定导入变量 # 在模块中加入 # ccc11.py __all__ = ['a','c'] a = 2 b = 3 c = 4 # ccc3.py from son_bag.ccc11 import * print(a,end=" ") print(b,end=" ") print(c,end=" ") print(d,end=" ") # 运行结果 报错
-
__all__
:模块内置属性,指定导入数据,也可以指定导入的模块-
__all__ = ['bar', 'baz']
-
-
用逗号引入多个变量
from son_bag.ccc11 import a,b,c,d
print(a,end=" “)
print(b,end=” “)
print(c,end=” “)
print(d,end=” ")
运行结果
100 20 30 40
8. 当导入数据,或书写数据过多时,可以在末尾加`\ ()`进行换行
9. `__init__.py`:会被自动调用
+ ```python
# 导包
import x1
# 结果
这是一个__init__.py文件
```
+ **应用场景:指定导入模块,和批量导入模块**
+ ```python
# 在x1包的__init__.py中指定模块
a = "这是一个__init__.py文件,将被自动执行"
print(a)
__all__ = ["cc1"]
# 运行c2
from x1 import *
print(a)
print(d)
# 结果:
报错
```
## 三、包和模块的常见错误
1. 包和模块是不能被重复导入
2. 避免循环导入
3. python 在导入模块的时候会执行模块中的代码
4. 入口文件
[^1]: `__init__.py`这个模块的名字比较特殊,就是文件夹的名字
[^2]: import可以导入包和模块
[^3]: 缩减导包的路径长度
. 包和模块是不能被重复导入
2. 避免循环导入
3. python 在导入模块的时候会执行模块中的代码
4. 入口文件
[^1]: `__init__.py`这个模块的名字比较特殊,就是文件夹的名字
[^2]: import可以导入包和模块
[^3]: 缩减导包的路径长度
[^4]: 直接导入变量,函数,或包