if __name__ == ‘__main__’到底是什么?
引子
要搞清楚这个问题,可以先听一个故事~~~
像我们做事一样,都需要一个起始点,终点存在与否无关紧要。编程也是一样,任何程序都有一个入口,在所谓的静态编译语言中,如Java
的入口是一个名字叫做Main
的类,所有的程序都必须从这里开始运行,因此读别人的Java
代码很方便,直接找入口就可以了。而Python
这种动态解释型的语言不一样,他的入口就是程序的第一行,从代码开始书写的地方一直读到程序末尾,这就很有意思了,为了让程序员读别人的代码更方便,也为了让程序输出更为简洁,约定俗成了一种规范,即模仿Java
,使用if __name__ == '__main__'
给程序设定一个入口。
if __name__ == '__main__'
是为了使Python
更优雅而约定俗成的一个程序入口。
但是,这个程序入口和Java
略有不同:
Java
强制程序所有的输入输出、流程控制等都在Main
类里面;Python
只是使用if __name__ == '__main__'
保证不是同一个模块的输入输出、流程控制等不相互影响。
分步骤详细举例说明
什么是
__name__
?
新建一个Python程序,a.py
# a.py
print('a.py':__name__)
输出:
a.py:__main__
再新建一个Python程序,b.py
# b.py
import a
# 当前程序包的名字
print('b.py':__name__)
# b.py程序的名字
print('a.py':a.__name__)
运行b.py
,输出:
b.py:__main__
a.py:a
小结
__name__
是程序的名称,当前运行程序的__name__
是__main__
,非当前运行程序的名称为程序的模块名称,即自定义值。
如果程序里面含有程序入口,那么程序如何执行呢?
即Python
只是使用if __name__ == '__main__'
保证不是同一个模块的输入输出、流程控制等不相互影响。如何解释呢?
# a.py
print('01:首先执行这一行代码')
if __name__ == '__main__':
print('02:然后执行这一行代码')
运行a.py
,输出:
01:首先执行这一行代码
02:然后执行这一行代码
以上说明,python
是顺序执行的,这个所谓的程序入口并不能改变执行顺序。
如果程序长这样呢?
# a.py
print('a-01:这是a程序的输出')
--------------------------
# b.py
import a
if __name__ == '__main__':
print('b-01:这是b程序的输出')
运行b.py
,输出:
a-01:这是a程序的输出
b-01:这是b程序的输出
可见,又一次证明程序是顺序执行的,而且程序入口并没有起作用。
那么,这个程序入口的作用是什么呢?
# a.py
if __name__ == '__main__':
print('a-01:这是a程序的输出')
--------------------------
# b.py
import a
if __name__ == '__main__':
print('b-01:这是b程序的输出')
运行b.py
,输出:
b-01:这是b程序的输出
这次成功阻止了a.py
程序的输出,可以轻松理解:Python
只是使用if __name__ == '__main__'
保证不是同一个模块的输入输出、流程控制等不相互影响。
小结
为了更简洁优雅的使用
Pyhton
十分建议将每个模块的执行逻辑和输入输出都放在程序入口里面,这样在调用时不会污染程序上下文执行环境。