__name__
__name__
name是python中一个魔法方法,他是一个隐含的变量,代表当前模块的名字,如果当前模块是主模块,则name的值为
__main__,否则为模块的名字
怎么去理解这个魔法方法呢?我们先了解python这个语言,python是一种解释型脚本语言,执行时从文件顶部,也就是说从代码的最起始位置逐行翻译,因此python是没有统一的程序入口的
__name__魔法最常用的一个例子是if __name__ == "__main__",既然python是从主程序的第一行开始执行的,那么在导入其他py文件中的方法的时候,就需要跳转到其他文件中并从第一行运行其代码,产生不必要的输出。要避免这种情况,就可以使用__name__来判断当前模块是否是主模块,如果是主模块,则执行下面的语句,否则不执行
这个语句的意思是,如果当前模块是主模块,则执行下面的语句,否则不执行,下面我们看一个例子
我们假设当前目录如下
1 | - main.py |
运行main.py文件,输出如下
1 | 我是util文件 |
程序运行过程如下: 当我们运行main.py文件时(此时该就是主文件),从util.py中导入了PI变量,但由于python是逐行执行的,他会将util.py中内容全部执行完,在回到主文件,由于util.py中有print语句,因此会输出其结果,然后再回到主文件,输出主文件中的内容
__name__语句是如何发挥作用的呢?
当我们运行main.py时,该文件就是主文件,__name__就会被赋值为__main__,但由于util.py不是主文件,因此__name__就会被赋值为util
本质上__name__这个魔法函数就是一个变量,当运行主文件时他就是__main__,运行其他包时就是包名
避免不必要的输出
知道上述原理之后,我们来修改上述程序,在运行main.py文件时,我们显然是不需要运行util.py中的print函数的,只需要其中的PI变量即可,因此我们修改上述文件为
1 | - main.py |
输出结果为
1 | 我是main文件 |
可以看到结果中没有util.py的print结果了,此外为了保险起见,我们最好讲main.py中的print语句之前也加上if __name__ == "__main__":,这样就可以保证在其他包导入main.py文件时不会执行main.py中的print语句了