一个故事带你理解if __name__ == '__main__'

如果你刚刚接触python,相信会在看别人的程序的时候会遇到if __name__ == '__main__'酱紫的语法,如果当时没看懂现在也一知半解的话,看下去,本文可以帮你解决这个问题。
大家都知道:Python的一大优点就是里面的模块非常多——包括内置的模块与自定义模块。我们可以直接利用别人写好的模块去实现自己的需求,酱紫大大的提高了自己的开发效率。也就是说,有时候你可能只需要一些文献阅读的能力与基本的编码能力也可以实现很强大的功能!~~这也许就是Python在各行各业各处开花的原因吧/叹气/叹气/叹气。

一个故事带你理解if name == 'main'

某年某月某日,你正坐在工位的电脑前发呆,此时,你的老板从你背后亲切的拍了拍你的肩膀:“小A呀,公司有一个新的产品要开发,里面有一个模块需要实现登陆请求功能,这个功能你来写吧,巴拉巴拉巴拉(告诉你具体的需求)”。此时的你血脉喷张、血压暴涨。内心里一千万个*奔腾而过:“我靠!好难!”
过了一个小时,你旁边工位的老死机王先生又亲切的拍了拍你的肩膀:“小A呀,别担心呀,公司上一个产品不是也有一个登陆请求的功能模块吗?直接拿来用就好了呀。”
“对呀!我不是学过引用么!那可是Ctr-C/V升级的技能呀!别人写的模块我直接拿来用就OK好了啊!”
于是,你以加班的名义于当天半夜悄悄打开了别人的电脑......
第二天,熬了一晚的你终于发现了登录模块~~~一个名为main.py的文件,里面的代码如下:
# main.py

def check():
print('我正在check...') def register():
print('我正在注册...') def login():
print('我正在登陆...') check()
register()
login()
此时的你突然精神百倍、容光焕发!“我靠,真是穿破了铁鞋找呀找没找到,你竟然如此简单的就被我找到啦,啊哈哈哈哈哈!”
于是你趁热打铁,赶紧在同一个目录下建了一个名为start.py的文件,用了python程序员专属的进阶复制粘贴功能————模块导入
# start.py

from main import login

login()

“万事俱备,只欠东风!接下来运行一下start.py我就可以跟老板要求升值加薪了,哇卡卡卡卡卡!”于是你点击运行了start.py......
而此时看到结果的你又开始血脉喷张、血压上升~“我靠!运行的结果为啥子会是酱紫的啊!”
我正在check...
我正在注册...
我正在登陆...
我正在登陆...
于是你赶紧检查代码:发现main.py文件里面除了login函数还有两个函数check与register,而且这个文件也运行了里面的三个函数,而运行的结果竟然跑到了你的start.py文件运行的结果中来了!
“这不科学呀!我只在我的文件里导入了login,没有导入其他的两个函数呀!而且我只运行了我自己的login呀!为啥main文件里的函数也会执行呢!!!”
此时的你感觉彻底陷入了绝境~想想早上看到老板那微微一笑的表情,心理不禁打了个冷颤~
“这该如何是好呀!”
而此时看到面有窘迫的你的老王再一次的来到了你的面前:“小A呀,在愁什么呢?”于是你把你的代码给老王看了看。
看完过后,老王露出了一丝意味深长的关心的微笑:“小A呀,你知道吗,当我们import一个模块的时候,Python解释器其实帮我们在后台执行了这个文件中的内容的,也就是说,由于你在start.py文件中import了main.py文件的函数,Python解释器会先执行main中的内容,然后再执行你自己的start文件中的代码的。而main文件中调用了它自己的三个函数,所以你执行的结果会包含main文件中执行的结果的。”
听完了老王的解释,你突然明白了,“嗖得寺内!那我直接把main文件中的函数粘贴进来不就可以了?哎呀,王叔,酱紫是可以,不过作为一个Python程序员,酱紫不是显得太Low了吗?而且如果以后别人的代码需要修改的话,我还得复制粘贴,酱紫太麻烦了,呜呜呜呜呜呜”
老王看着委屈的你,露出了关切的笑容:“小A呀,我没告诉你复制粘贴呀”随后,他亲切的摸了摸你的头说道:“来,叔叔帮你解决”,于是,老王帮你把main.py中的内容修改如下:
# main.py

def check():
print('我正在check...') def register():
print('我正在注册...') def login():
print('我正在登陆...') if __name__ == '__main__':
check()
register()
login()
你自己的start.py文件的内容不变,随后,他运行了一下你的start文件,奇迹发生了:
我正在登陆...
结果只显示了一行!而且正是你要的结果!
“其实,if __name__ == '__main__':是在告诉Python编译器:下面的代码只有在运行我这个文件的时候才执行,当作为模块导入到别的模块的时候,编译器只编译它前面的内容,我们把函数的执行放在了if __name__ == '__main__':的后面,这样可以有效的避免在不需要的时候错误的调用了本模块的方法”
听完了老王的解释后,你顿时容光焕发!调试了几遍无误并感谢了老王后,兴冲冲地跑到了老板的办公室......
而此时,老王看着你开心的背影,脸上露出了父亲般的亲切的笑容......
未完待续.........
上一篇:基于Python的接口自动化测试框架


下一篇:【T-SQL进阶】02.理解SQL查询的底层原理