一.if _ name _ == 'main’的理解
__name__是魔法函数的一种,如果大家想详细了解和魔法函数相关的知识点击这里,里面整理了Python中常见的魔法函数用法,都有详细的代码解析:https://zhuanlan.zhihu.com/p/344951719
与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。
在某种意义上讲,if _ name_== ‘_ main_’ 也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if _ name_==’_ main_:”这条代码的意义之一。
二.实验
在Test16.py文件中写下如下几行代码:
print("GO GO GO")
print(__name__)
if __name__ == '__main__':
print("Andy is the master !")
在Test17.py文件中写下如下几行代码:
from package0 import Test16
if __name__ == '__main__':
print("dddd")
print(Test16.__name__)
print(__name__)
运行Test16.py文件,得到结果,如下图:
我们看到,Test16.py的__name__就是__main__。
随即我们运行Test17.py文件,得到结果,如下图:
① 运行Test17.py,发现涉及导包操作,先运行导入的模块Test16,py文件。
② 到Test16,py的 if _ name_== ‘_ main_’ 这一行的时候,发现不对,Test16.py的__name__与源文件Test17.py本身的__name__是不一样的,所以Test16.py中if _ name_== ‘_ main_’ 下面的代码不再运行(也就是Andy is the master !这一条语句不再打印输出)。
③ 运行完Test16,py后,运行Test17.py自己的代码,而运行到 if _ name_== ‘_ main_’ 时,判断Test17.py的__name__就是Test17.py本身的__name__,执行下面的代码(也就是dddd等语句将会被打印)。
我就想能不能这么打印一下 : print(Test17._ name _),在Test17.py中添加代码,运行,报错了,错误如下:
原来是没有识别到Test17这个模块,我还想到了能不能用 print(this. _ name _) 、print(self. _ name _)来打印这个属性,发现依然报错,如果哪位大佬知道除了print( _ name _)这个方法来打印这个内置属性,一定要在评论区中回复啊!!!博主我当场拜师,哈哈哈哈
三.结论
- 每一个单独的python文件,运行的时候,打印自己的__name__都是__main__,实则是有区别的,每一个python文件的__name__都是不一样的,是包名.文件名(eg:package0.Test16)。
- 如果涉及导包操作,解释器,会先去执行导入模块的代码(eg:Test16.py)
- 对于if _ name_== ‘_ main_’ 下面的语句就能否被执行:
I.不涉及导包操作,源文件中的if _ name_== ‘_ main_’ 下的语句可以被执行。
II.涉及导包操作,源文件中的if _ name_== ‘_ main_’ 下的语句可以被执行,但是导入文件中的if _ name_== ‘_ main_’ 下的语句将不被执行。(所以可以将测试代码写到导入文件中的if _ name_== '_ main_'下,让它在该执行的时候执行 )