制作模块
制作模块
每个python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要复合标识符命名规则。
模块的作用:降低工作量;一些功能需要在多处频繁使用,这些功能可以封装成模块
定义模块
新建一个python文件,命名为my_module
,并定义testA
函数
def testA(a, b):
print(a + b)
测试模块
在my_module
文件中添加测试信息
def testA(a, b):
print(a + b)
# 测试信息
test(1, 1)
测试完成后应该删除测试阶段添加的测试信息吗?解决办法如下:
def testA(a, b):
print(a + b)
# 只有当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行testA函数调用
if __name__ == '__main__':
test(1, 1)
__name__
只有在当前文件中运行时,它的值才是__main__
。
调用模块
在新建一个python文件,导入上述定义的模块
import my_module
my_module.testA(2, 2)
模块定位顺序
当导入一个模块,python解释器对模块位置的搜索顺序是:
- 当前目录,即python文件所在的文件夹
- 如果不在当前目录,则搜索在shell变量PYTHONPATH下的每个目录
- 如果都找不到,会查看默认路径。Unix下,默认路径为
/usr/local/lib/python/
。
模块搜索路径存储在system模块的sys.path变量中。变量包含当前目录、PATHONPATH和由安装过程决定的默认目录。
注意:
- 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
- 使用
from 模块名 import 功能
的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
def sleep():
print('这是自定义的sleep')
from time import sleep
sleep(2) # 此时调用的是time中的sleep函数
from time import sleep
def sleep():
print('这是自定义的sleep')
sleep(2) # 此时调用的是自定义的sleep, 因参数不一致报错
拓展:名字重复的严重性
import time
print(time) # <module 'time' (built-in)>
time = 1
print(time) # 1 此时导入的time模块被变量time覆盖,不能使用
为什么变量也能覆盖模块?
因为在python中,数据是通过引用传递的,time变量和模块time都是引用