引言
在学Python时看到很多代码的最后一部分都会写if __name__ == '__main__':
,如果我不这么写又没任何影响。那这段代码到底有何意义呢?带着疑问我查看了很多人写的博客,在这里我就总结一下我个人的理解。
理解
__name__
是什么呢?
通过它的书写格式,我们可以判断它是一个系统内部的特殊变量。因为变量以双下划线开头并以双下划线结尾,我们可以直接访问它,但不可以对它进行修改。
那我很好奇if __name__ == '__main__'
这段代码是if语句,那它究竟在什么时候成立呢?我们拿以下两段代码进行举例分析。
# !/usr/bin/env python3
# -*- coding:UTF-8 -*-
# code1.py
def hello1():
print('Hello1')
def hello2():
print('Hello2')
hello1()
print(__name__)
if __name__ == '__main__':
hello2()
hello1()
在执行上面这段代码时,输出结果为
Hello1
__main__
Hello2
Hello1
也就是说,在执行本段程序时,__name__
变量的值为__main__
。那什么时候__name__
变量的值不为__main__
呢?
# !/usr/bin/env python3
# -*- coding:UTF-8 -*-
# code2.py
import code1 # 导入code1
print('--------------------------')
print(code1.__name__) # code2调用code1中的__name__
print('--------------------------')
print(__name__) # code2调用本身的__name__
输出为
Hello1
code1
--------------------------
code1
--------------------------
__main__
在import code1
后,自动执行了code1内部的两段代码hello1()
和print(__name__)
。
在code2
中调用code1
中的__name__
时,输出为code1
。
也就是说,在本文件中调用本文件的__name__
时,__name__
为__main__
;在本文件中调用其他文件的__name__
时,__name__
为被调用文件的名字。
也可以这么理解
假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是__main__,通过if判断这样就可以执行“mian:”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“mian:”后面的内容。
听起来有点绕口,不太好理解,可以通过自己编写代码尝试一下。
目的
那这么做的目的是什么呢?
- 保证代码的规范性。
- 在编写一个Python文件时,我们想在执行这个文件时就有相应的输出,但并不希望在其他文件调用该文件时也有这个输出,那我们就可以将这个内容写在
if __name__ == '__main__':
里。 - 在编写库的时候,为了方便测试,我们也可以在
if __name__ == '__main__':
里写测试函数的内容,并且这个函数并不影响主函数对这个库的调用。
以上内容为个人理解,如有错误,欢迎指点~