之前我们都是在一个py文件中写所有的代码,这样比较杂乱,就像是在一个箱子里,放了所有的生活用品一样。
我们最好是把相同功能的代码放在一个py文件中,这样分类好,有助于我们查询并管理自己的代码。
但是这就产生了一个问题,我们如何在A文件中去使用B文件的代码。
这就是我们今天[模块]要讨论的内容。
我们可以将一个py文件叫做模块,这个模块中,定义好了相关的变量和函数,方便其他文件使用。
别人可以将他们自己写好的功能的几个模块,集成起来,我们一般叫它——库,把库发布到网上,可以让别人安装使用。
我们安装Python后,会自带有一些库,这些库叫标准库,是Python的官方库。
我们自己别外安装的库,叫做第三方库。
在我们安装好Python后,标准库就在我们的电脑上了。
第三方库,需要我们自己安装到电脑上(安装比较麻烦,后面我们单独出一期来讲解)
之前让大家安装的Anaconda,就已经安装好了大量的常用的第三方库,可以节省大家的时间。
想要使用已经安装好的库,我们需要先引用它,然后才能使用。
引用一般使用import和from...import两种方式。
import引用
- 首先我们新建一个模块ModelA.py
- 然后我们再新建一个模块ModelB.py
- 接着我们在另一个py文件中引用这两个模块,并使用它们的变量和函数
import ModelA
import ModelB
print(ModelA.add(2, 3))
print(ModelB.add(2, 3))
print(ModelA.a_parameter_1)
print(ModelB.b_parameter_2)
print(ModelB.a_parameter_3)
结果为:
6
Model_A_parameter
[6, 7, 8, 9, 10]
Traceback (most recent call last):
File "C:/Users/MingJue/PycharmProjects/untitled/Test/test.py", line 8, in
print(ModelB.a_parameter_3)
AttributeError: module 'ModelB' has no attribute 'a_parameter_3'
- 我们先后import了ModelA和ModelB
- 然后先调用了ModelA的add函数(逻辑为加法),参数设置为2和3,结果是5
- 然后再调用了ModelB的add函数(逻辑为乘法),参数设置为2和3,结果是6
- 又打印了ModelA和ModelB的一些变量
- 最后尝试去调用ModelB中不存在的变量,然后就报错了
通过这个例子,我们可以看出,import是直接把整个模块都引入了进来。
我们可以使用from...import的方法,只引用指定的东西
from...import引用
还是使用ModelA.py和ModelB.py。
我们修改了一下test.py的内容:
from ModelA import add
from ModelB import add
from ModelB import b_parameter_2
print(add(2, 3))
print(add(2, 3))
print(b_parameter_2)
print(ModelA.a_parameter_1)
结果为:
6
6
[6, 7, 8, 9, 10]
Traceback (most recent call last):
File "C:/Users/MingJue/PycharmProjects/untitled/Test/test.py", line 8, in
print(a_parameter_1)
NameError: name 'a_parameter_1' is not defined
- 我们先使用from,声明我们要从ModelA中去import引用add函数
- 我们又使用from,声明我们要从ModelB中去import引用add函数
- 这个时候,我们就会发现,有两个add函数!
- 重复的函数名称,会以最后引用的add函数为主,所以结果都是2*3=6
- 然后我们使用from,声明我们要从ModelB中去import引用b_parameter_2变量,就可以直接使用了
- 如果我们没有引用的东西,我们是不能使用的,会报错
注意!!!
- 我们还可以使用from ModelB import * 来引用ModelB模块中所有的东西
- 是不是跟我们的import ModelB一样呢?其实并不是,还是有区别的
- 假设,我们在ModelB.py模块中,使用了import ModelA,那么我们就可以在ModelB.py模块中去调用ModelA.a_parameter_1了
- 这个时候,我们在test.py模块中,使用from ModelB import *的话,我们也可以在test.py中去使用ModelA.a_parameter_1了
- 这是因为from ModelB import *,在引用的时候,除了会把ModelB模块中的所有变量和函数引用了,也会把ModelB模块在引用的其它模块,也引用到test.py中去。
- 如果我们在test.py模块中,使用的是import ModelB的话,就不能使用ModelA.a_parameter_1了
之后我们会讲解一下常用的标准库函数,和第三方库的函数,都会使用到引用模块这一做法