...

如何理解if __name__ == '__main__'

Python初学者在学习代码时常常会看到if __name__== '__main__': 这样的代码,这个是什么意思呢?

Python中有很多内置变量和内置方法(也称魔术变量/魔术方法),为了避免和用户的变量冲突,内置变量和内置方法通常以两个下划线开头和结尾。

常见的内置变量有:

  • __file__:表示当前文件(路径)
  • __package__:当前文件所在包名
  • __name__:当前模块名
  • __cached__: 当前缓存路径
  • __buildins__: 当前可用所有内置方法(字典)

注意这些都是正常的变量,使用时不加引号。

内置(魔术)方法就更多,如__init____str____get_attr__等等。

所以,if __name__ == '__main__':是判断当前模块名是不是字符串'__main__'
我们知道Python中每个文件(模块)都可以导入其他模块。
当前运行的文件(模块)被称为主模块,此时其模块名__name__为字符串'__main__'
而其他导入的模块的模块名__name__则为导入的模块名(导入路径+文件名去掉.py)。

例如, 有两个文件a.py和b.py,a中导入b模块执行,代码如下:
b.py代码

print('我是b模块,我的模块名为', __name__)

if __name__ == '__main__':
    print('只有我自己运行时才会打印,别人导入我时不会打印')

a.py代码

import b
print('我是a模块,我的模块名为', __name__)

运行a.py后打印结果为:

我是b模块,我的模块名为 b
我是a模块,我的模块名为 __main__

这里我们可以看到a模块是主模块,及运行的是a.py文件。b.py中if __name__=='__main__':中的代码没有打印。
如果我们运行b.py,则会打印if __name__=='__main__':中的代码,运行结果如下:

我是b模块,我的模块名为 __main__
只有我自己运行时才会打印,别人导入我时不会打印

因此 if __name__ == '__main__':可以用来判断是从当前文件运行的,如果是当前模块才执行if里面的代码。
也称为模块私有代码, 常用作测试当前模块使用,并且不影响别的模块导入使用。

posted @ 2022-04-05 20:27  韩志超  阅读(107)  评论(0编辑  收藏  举报