定义一个自己的模块
在python中,每个python文件都可作为一个模块,而文件名就是模块名。比如我们创建一个test.py文件,那么这个test.py文件就是一个模块,模块名称就是test
test.py
#test.py
def test():
print("我是test模块中的test函数")
使用自己的模块
定义好了自己的模块,接下来我们就可以在其它模块中使用我们的模块了,通过import test导入整个模块,或通过from test import test的方式直接导入模块中的test函数。比如我们在建一个main.py文件,然后在该文件中导入test模块并调用test函数
main.py
#main.py
import test
test.test()
当运行main.py时就会输出:我是test模块中的test函数
测试模块及__name__的使用
在实际开发过程中,一个模块开发完成后,开发人员往往会加一些测试代码以保证代码功能的正确和稳定。比如上面创建的test模块,编写完成后想侧一下test的功能是否正常,这时就会直接在模块中调用一下test函数
#test.py
def test():
print("我是test模块中的test函数")
#测试test函数功能是否正常
test()
#运行后输出结果
"我是test模块中的test函数"
这时候当我们直接运行test.py文件时会打印输出“我是test模块中的test函数”,这样看上去好像一切正常没什么问题。但是如果我们在main.py模块中去导入test模块然后调用用test函数,看看接下来会发生什么
#main.py
import test
test.test()
#直接运行main模块
#运行结果:
"我是test模块中的test函数"
"我是test模块中的test函数"
我们看到运行结果打印输出了两行"我是test模块中的test函数",这是为什么呢,原因是当我们导入一个模块时,这个模块中的代码就会被执行一次。比如test模块本身会调用一次test函数,所以在main中导入test时,test模块中调用test函数的代码就会被执行,而我们在main模块中又调用了一次test函数,所以最终输出两个"我是test模块中的test函数"。 那么如何避免这种情况,即在导入模块时不去执行模块中的测试代码呢?让我们在看一个例子,首先在test.py中加一段打印__name__的代码
#test.py
def test():
print("我是test模块中的test函数")
print('__name__的值是:%s'% __name__)
#直接运行test.py
#结果输出
"__name__的值是:__main__"
然后再在main.py文件中导入一下test模块
#main.py
import test
#只是导入test模块其它什么都不执行
#直接运行此文件
#运行结果
"__name__的值是:test"
通过上面的示例我们可以看到,两次运行的结果__name__的值是不一样的,在test模块中__name__的值是__main__,而在main模块中导入test模块时__name__的值却是test。这时我们就可以通过判断__name__的值来解决上面提出的问题了,即在其它文件中导入模块时不去执行模块中的测试代码。下面再来修改一下上面的代码:
#test.py
def test():
print("我是test模块中的test函数")
#测试test函数功能是否正常
if __name__ == "__main__":
test()
#运行后输出结果
"我是test模块中的test函数"
这个时候当我们再在main模块中导入test模块时,test模块中的测试代码就不会被执行了。
总结:
可以根据__name__变量的结果能够判断出,是直接执行的python脚本还是被引入执行的,从而能够有选择性的执行测试代码