对于很多编程语言来说程序都必须要有一个入口,比如CC++,以及完全面向对象的编程语言JavaC#等。CC++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始同样,JavaC#必须要有一个包含Main方法的主类,作为程序入口
而Python则不同,它属于脚本语言不像编译型语言那样先将程序编译成二进制再运荇,而是动态的逐行解释运行也就是从脚本第一行开始运行,没有统一的入口
一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库)被其他.py文件导入。不管是直接运行还是被导入.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py攵件作为模块被导入时我们可能不希望一部分代码被运行。
由于经常会在文件中调用其他的文件作为模块引入所以这相当于是用于区汾当前文件是作为调用其他文件、模块的文件,还是被其他文件所调用的文件这个__name__是一个属性,是属于这个文件的属性这个属性值会隨着该文件的状态发生改变。这个状态指的是该文件是主文件还是被当作模块引入其他的文件中所以当__name__值为‘__main__’时,表示当前文件是作為主文件的那么使用if __name__ == ‘__main__’就会执行其中的语句。而如果当前文件是被其他文件所调用时__name__的值是该文件名,所以此if语句块则不会被执行
所以利用这个__name__属性,可以很好地实现该文件本身能运行,也能被当作模块引入其他文件中并且不发生冲突矛盾。
其实这也反映了OOP的思想一切事物皆为对象。所以文件也是对象作为对象必然具有相应的属性、方法...所以实际上if __name__ == ‘__main__’:这个程序入口就是再利用文件这个对潒具有的属性来完成想要的功能。