制作模块

制作模块

每个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解释器对模块位置的搜索顺序是:

  1. 当前目录,即python文件所在的文件夹
  2. 如果不在当前目录,则搜索在shell变量PYTHONPATH下的每个目录
  3. 如果都找不到,会查看默认路径。Unix下,默认路径为/usr/local/lib/python/

模块搜索路径存储在system模块的sys.path变量中。变量包含当前目录、PATHONPATH和由安装过程决定的默认目录。

注意:

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都是引用