Python提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。
模块(py文件),模块相当于一盒积木,而模块中的函数相当于一块积木,一个py文件中可包含多个函数/类/方法,模块化编程通常把复杂的程序分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。
代码可重用性:当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无需做重复性的编写工作,直接在程序中导入该模块即可使用该功能。
模块化是更高级的封装
Python中的包和模块可以分为三类:
1、标准包/模块:即python自带的模块,通过import导入后使用,如:os , random等
2、第三方包/模块:即非python自带,需要通完pip install来安装后,再import导入使用,如接下来常用的:requests, pyYaml, pytest, selenium等模块;
3、自定义包/模块:即自己封装的py文件,通过import来导入使用
回顾一个之前学过的封装:
import语句,用于导入py模块,调用模块中的封装
import random # 导入random.py
ran_num = random.randint(0, 9)
import 的基本使用:
import 模块名1 [as 别名1], 模块名2 [as 别名2],…
:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。# D2.py
def func_01():
print("这是func_01函数")
class FuncClass:
def func_02(self):
print("这是类中func_02方法")
在D1.py 中调用D2.py中的函数和方法(D1.py与D2.py在同一文件夹下)
#D1.py
import D2 # import 模块名 即导入D2.py模块
D2.func_01() # 模块名.函数
D2.FuncClass().func_02() # 模块名.实例.方法
from ... import 语句
from [文件夹名].模块 import 函数/类 (D1.py与D2.py可不在同一文件夹下,不在同一文件夹下时需要指定文件夹名)
#D1.py
from study_day01.D2 import func_01, FuncClass
func_01()
FuncClass().func_02()
from 文件夹.模块 import 函数名/类名
#D1.py
from study_day01.D2 import FuncClass
from study_day01.D2 import func_01
# from study_day01.D2 import FuncClass, func_01
func_01()
FuncClass().func_02()
把模块中的函数或类全部导入
from 文件夹.模块 import *
#D1.py
from study_day01.D2 import * # 通过 import * 导入D2.py模块的全部函数或类
func_01()
FuncClass().func_02()
python的__name__变量
__name__变量是python内置变量,通过学习import,我们知道py模块的运行分为直接运行与通过导入后的间接运行
py模块直接运行时:name__变量在Python内部会变为__main
py模块通过导入间接运行时:__name__变量在Python内部会变为对应运行的模块名
例:
#study_02.D4
def func_d4():
print('执行函数func_d4中的代码')
print(f'D4.py模块此时__name__变量的值为:{__name__}')
class FuncD4Class:
def methond_d4(self):
print('执行方法method_d4中的代码')
func_d4()
运行结果:
执行函数func_d4中的代码
D4.py模块此时__name__变量的值为:__main__
在同目录下新建一个D5.py模块,在D5.py模块中通过import导入D4.py
#study_02.D5
from D4 import func_d4
print(f"这是D5.py模块中的__name__此时的值为:{__name__}")
运行结果:
执行函数func_d4中的代码
D4.py模块此时__name__变量的值为:D4
这是D5.py模块中的__name__此时的值为:__main__
上面代码示例表明在D5.py模块中通过导入D4.py模块,会执行D4.py模块下的可执行代码 func_d4() 函数,该函数中__name__变量变更为自己的所属的模块名D4,如果不通过导入调用,直接在D4.py下执行func_d4()函数,__name__变量为__main__,通过此特性如果D4.py模块下的代码不想被D5.py模块导入时执行,可加入判断 if __name__ == '__main__': 把不需要被导入执行的代码放到 if 判断的子语句中。
#study_02.D4
def func_d4():
print('执行函数func_d4中的代码')
print(f'D4.py模块此时__name__变量的值为:{__name__}')
class FuncD4Class:
def methond_d4(self):
print('执行方法method_d4中的代码')
if __name__ == '__main__':
func_d4()
在D5.py模块中运行
from D4 import func_d4
print(f"这是D5.py模块中的__name__此时的值为:{__name__}")
运行结果:
这是D5.py模块中的__name__此时的值为:__main__
D5.py模块中虽然导入了D4模块的func_d4,但并没有执行调用func_d4( ),是因为在D4模块在D5中导入后__name__变量实际值为D4,D4 ≠ __ main __,所以import时并不执行func_d4( )该函数。