文章目录
一、模块概念
Python模块(Module),是一个Python文件,以
.py
结尾,包含Python对象定义和Python语句。
模块能定义函数、类和变量,也可以包含可执行的代码。
白话如下:
- 每一个以扩展名
py
结尾的 Python 源代码文件都是一个 模块 - 模块名 同样也是一个 标识符,需要符合标识符的命名规则
- 在模块中定义的 全局变量 、函数、类 都是提供给外界直接使用的 工具
- 模块 就好比是 工具包,要想使用这个工具包中的工具,就需要先
导入
这个模块
二、模块导入与使用
2.0 准备工作
编写模块:wc_module01.py
,代码如下:
title = '旺财模块01'
def say_hello():
print('hello wc01')
class Student:
pass
编写模块:wc_module02.py
,代码如下:
title = '旺财模块02'
def say_hello():
print('hello wc02')
class Teacher:
pass
2.1 import
2.1.1 导入
可以通过import
关键字导入模块,如下:
import module1,module2...
如果导入多个模块,以逗号
相隔,不过不建议这么做,应采取每个模块独占一行
的方式,如下:
import module1
import module2
...
eg.
import wc_module01
import wc_module02
2.1.2 使用
模块导入之后,可以通过模块名.
方式使用提供的工具—函数、类、全局变量。
示例如下:
import wc_module01
import wc_module02
wc_module01.say_hello()
wc_module02.say_hello()
print(wc_module01.title)
print(wc_module02.title)
print(wc_module01.Student())
print(wc_module02.Teacher())
输出如下:
hello wc01
hello wc02
旺财模块01
旺财模块02
<wc_module01.Student object at 0x1030522e8>
<wc_module02.Teacher object at 0x1030522e8>
2.2 from…import
2.2.1 导入
如果希望从某一个模块导入部分指定工具,可以使用from import
的方式,如下:
from 模块名 import 工具名
示例如下:
from wc_module01 import say_hello
from wc_module02 import Teacher
2.2.2 使用
通过这种方式导入,不需要再通过模块名
,可以直接使用其提供的工具—函数、类、全局变量
示例如下:
from wc_module01 import say_hello
from wc_module02 import Teacher
say_hello()
print(Teacher())
输出结果为:
hello wc01
<wc_module02.Teacher object at 0x103937668>
2.3 from…import *
from module import *
是指一次性导入模块的所有工具,该方式不建议使用,一个是效率问题,再一个也不方便问题排查,这里也就不再赘述了。
三、模块扩展
3.1 搜索路径
当导入一个模块时,Python解释器对模块的搜索(加载)顺序如下:
- 当前目录
- 如果不在当前目录,Python则搜索shell变量
PYTHONPATH
下的每个目录 - 如果都搜索不到,Python则会查看默认路径,在
Linux
中,默认路径一般为/usr/local/lib/python/
有了如上加载顺序,我们在开发过程中,也需要主要模块名的命名,不要与系统的模块名重名。
示例:
import random
# 生成一个 0~10 的数字
rand = random.randint(0, 10)
print(rand)
如果当前目录存在random.py
文件的话,那么此时程序运行就会挂掉了。因为这个时候,Python解释器会加载当前目录下的random.py
,而不会加载系统的random
模块。
3.2 加载顺序
如果两个模块存在同名函数,那么后导入的模块会覆盖之前导入模块的函数,其他全局变量、类也是同样的道理。
在开发时,导入模块相关代码应统一写在代码的顶部,通过开发工具,更能及时发现问题。
3.3 别名
如果模块名过长或两个模块存在同名冲突时,可以通过as
关键字给其中一个模块起别名的方式解决。
from 模块名 import 工具名 as 别名
这样,后续可以通过别名进行模块工具的调用。
示例如下:
from wc_module01 import say_hello as hello01
hello01()
3.4 模块规范
通过之前的描述,已经知道,每一个python文件都是一个模块,那么在导入模块时,模块中所有没有任何缩进的代码都会被执行一遍。
在实际开发中,模块开发人员会做一些测试代码,而这些测试代码又不希望在模块被引用时被动执行,此外对于调用者来说,是不应该看到或执行这些测试代码的,那么应该怎么做呢?
接下来,__name__
隆重出场了。
__name__
是Python的一个内置属性,记录着一个字符串- 如果是被其他文件导入的,
__name__
的值就是模块名 - 如果是当前执行的程序,那么
__name__
的值就是__main__
因此,在很多Python文件中会看到以下格式的代码:
# 导入模块
# 定义全局变量
# 定义类
# 定义函数
# 在代码的最下方
def main():
# ...
pass
# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
main()
这样,既方便模块开发者测试,又不会对引入该模块者造成影响。
四、小结
Python中模块开发的好处多多,优点多多,总结起来如下:
- 提高了代码的可维护性
- 提取重复或工具代码,提高开发效率
- 通过
as
关键字,可以在不同模块存在相同的函数名和变量名。但切记不要和系统内置的模块名称重复。