很多Python项目,在.py文件底部都有下面的代码块,Python初学者通常会好奇if语句中的__name__有什么作用。
if __name__ == "__main__":
main()
先说结论:
__name__实际上就是一个内置、特殊属性(变量),代表模块、类、函数的名字。
详细说明:
官方定义说明:对于__name__,Python官网的解释如下:
翻译过来,__name__属于Python内部的特别属性,为类、函数、方法等的名字。
以__name__作为关键词继续在Python的官方Doc搜索,得到下面的截图:
这张截图进一步说明__name__为函数的名字。
实践效果:
创建2个py文件,其中aa.py文件
print("before AAClass")
class AAClass(object):
print("run AAClass")
print("after AAClass")
print("before aa_function")
def aa_function():
print("run aa_function")
print("after aa_function")
print("__name__ = ", __name__)
if __name__ == "__main__":
print("if")
aa_function()
else:
print("else")
bb.py文件
from aa import aa_function
aa_function()
运放方式1:aa.py作为主程序直接运行,结果:
before AAClass
run AAClass
after AAClass
before aa_function
after aa_function
__name__ = __main__
if
run aa_function
运行方式2:运行bb.py(将aa.py作为模块导入到bb.py中),结果:
before AAClass
run AAClass
after AAClass
before aa_function
after aa_function
__name__ = aa
else
run aa_function
从上述结果分析,两种运行方式所得结果的区别在于倒数第3、第2行。
__name__取值会随模块的运行方式不同而不同:
(1)模块aa.py作为主程序直接运行时,__name__的取值等于字符串"__main__",aa.py会执行if语句。
(2)模块aa.py被import导入时,__name__取值为aa(模块名字,不含.py后缀),aa.py会执行else语句。
使用场景:
在if __name__ == "__main__"语句中添加测试代码,对模块中各个函数进行测试。当模块被import到其他模块中时也不需要改动(删除)测试代码。
本文原创,原始版本发表链接:
kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--