一、什么是自定义模块?
Python中虽然内置了许多实用的模块,但有时我们需要根据特定需求创建个性化的模块。这就可以通过自定义模块来实现,也就是自己编写一个模块。
注意:
每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说自定义模块名必须要符合标识符命名规则。
二、自定义模块的导入
①导入自定义模块
在Pycharm中新建一个名为my_module1的python文件,并定义test函数。
②导入不同模块的同名功能
在 Python 中导入多个模块时,如果模块内有同名的功能,那么调用这个同名功能的时候,后导入的会覆盖先导入的。
三、自定义模块的测试
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,开发人员通常会在.py文件中添加一些测试信息。
例如,在my_module1.py文件中添加测试代码test(1,2)
代码语言:python代码运行次数:0复制def test(a,b):
print(a b)
test(1,2)
输出结果:
3
问题:
在模块中添加测试代码后,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行test
函数的调用。
from my_module1 import test
输出结果:
3
解决方案:
使用if __name__ == '__main__':
判断模块是否直接运行。
每个 Python 模块都有一个内置的属性 __name__
,这个属性的值根据模块的使用方式而不同。
- 直接运行模块:
如果 Python 解释器直接运行该文件,
__name__
的值为'__main__'
,__name__ == '__main__'
为真,紧随其后的代码会被执行 - 导入模块:
如果该文件被另一个模块导入,
__name__
的值则是这个模块的名称,'__main__'
,__name__ == '__main__'
为假,紧随其后的代码不会被执行。
def test(a,b):
print(a b)
if __name__ == '__main__':
test(1,2)
代码语言:python代码运行次数:0复制输出结果:
3
from my_module1 import test
输出结果为空
四、自定义模块的封装
__all__
是一个列表,定义了从模块中使用 from module import * 导入的名称。列表中包含的名称会被导入,而未在列表中列出的名称不会被导入。
如果一个模块文件中有__all__
变量,当使用from xxx import *
导入时,只能导入这个列表中的元素
这种机制有助于封装模块的接口,确保用户只能访问特定的功能,增强模块的安全性和可维护性。