__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语句了