您的位置:首页 > 编程语言 > Python开发

Python 中的 if __name__ == '__main__'理解

2017-12-06 10:46 323 查看
关注微信公众号【Microstrong】,我写过4年Android代码,了解前端、熟悉后台,现在研究方向是机器学习、深度学习!一起来学习,一起来进步,一起来交流吧!欢迎扫描下方二维码关注!



01



程序入口的概念

对于很多编程语言来说,程序都必须要有一个入口。比如说,面向过程的程序设计语言C和C++都需要有一个main函数来作为程序的入口,也就是说程序的运行是从Main函数开始的。同样,对于面向对象的编程语言来说,Java和C#也是必须包含一个Main方法的主类来作为程序的入口。

而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个Python文件有两种使用方法。一种是直接作为脚本执行,也就是直接运行。第二是import到其他的Python脚本中被调用。不管是导入还是直接运行,有些代码都会被运行。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

因此if__name__==’__main__’:的作用就是控制上面两种Python执行代码的过程。if__name__==’__main__’:下的代码只有作为脚本直接运行的时候才被执行,而import到其它脚本中是不会被执行的。

02



这段代码的作用

下面,我会举一个生动形象的例子,来跟大家演示这段代码的作用。

(1)建一个文件Microstrong.py,然后写入下面代码。  



这里我们定义了一个常量,然后又写了一个main
函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python Microstrong.py),输出:



(2)现在,我们有一个area.py文件,用于计算圆的面积,该文件里边需要用到Microstrong.py
文件中的 PI 变量,那么我们从 Microstrong.py 中把 PI 变量导入到 area.py 中:



运行 area.py,输出结果:



我们可以看到,Microstrong.py中的 main 函数也被运行了,实际上我们是不希望它被运行,不希望看到PI:3.14,同时提供 main 也只是为了对常量定义进行下测试。

(3)这时,if __name__ == '__main__' 就派上了用场。把 Microstrong.py改一下:



运行下
Microstrong.py,输出如下:



在运行一下area.py,输出如下:



03



这段代码的运行机制

每个python模块(python文件,也就是此处的Microstrong.py和area.py)都包含内置的变量__name__。当模块直接被执行的时候,__name__等于"__main__",其实就是指当前模块名(例如:Microstrong.py);如果import到其他模块中,则__name__等于这个模块名称(例如:Microstrong,不带后缀.py)。所以当模块被直接执行时,__name__
== "__main__"结果为真,它包含的下层代码(Python 用缩进来区分代码层次)才能被执行。我们用例子来说明真相。

(1)我们在Microstrong.py文件的if __name__=="__main__":之前加入print __name__,即将__name__打印出来。文件内容如下:



输出结果如下:



可以看出,此时变量__name__的值为"__main__";

(2)执行area.py,代码内容如下:



我们再来观察一下area.py产生的结果:



此时,area.py中的__name__变量的值为"__main__",而Microstrong.py中的__name__变量值为Microstrong,不满足__name__=="__main__"的条件,因此,无法执行其后的代码。

03



小故事

用一个小故事来结束我们对if __name__ == '__main__'理解。

小强.py

女朋友眼中你是小强(__name__== '小强'), 

你自己眼中你是你自己(__name__ == '__main__'),

你编程很好, 女朋友调你去帮他写程序(import 小强, 这时你在女朋友眼中: __name__ == '小强'),

但你晚上也会打开某某XX网站, 做一些自己的事情(直接运行小强.py, __name__ == '__main__')

参考资料:
http://www.dengfeilong.com/post/60.html http://blog.konghy.cn/2017/04/24/python-entry-program/
if __name__ =='__main__' 如何正确理解? - 铭尚hkyue的回答 - 知乎https://www.zhihu.com/question/49136398/answer/138164069
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: