要理解 if __name=’__main __’ 把握3个要点:
- __name__本身,代表什么
- if __name=’__main __'这个表达式,代表什么
- 常见场景:模块导入
对上面的3个要点进行逐一解释:
- __name__本身,代表什么?
python有内置的魔法方法,同时也有内置的魔法属性,以__开头和结尾的通常就是魔法方法和魔法属性。__name__就是python内置的魔法属性, 代表对应py文件的名称(py文件的命名)。 - if __name=’__main __‘这个表达式,代表什么?
if __name=’__main __'是一个判断表达式,表示:左边代表py文件的命名,是否,与右边‘main’这个字符值相等。如果相等,执行if下面的语句(通常是函数调用)。 - 常见场景:模块导入
新建一个py文件,命名为test1,内容为:
def a():
print("这是函数a")
def b():
print("这是函数b")
a()
b()
print(__name__)
打印结果为:
这是函数a
这是函数b
__main__
将test1内容更改为:
def a():
print("这是函数a")
def b():
print("这是函数b")
# a()
# b()
# print(__name__)
if __name__ == '__main__':
a()
b()
print(__name__)
打印结果为:
这是函数a
这是函数b
__main__
两次结果一样。
再新建一个py文件,命名为test2,内容为:
from test1 import a
from test1 import b
# import test1 两种导包方式供参考
def c():
print("这是函数c")
def d():
print("这是函数d")
#两种调用方式供参考
# c()
# d()
# print(__name__)
if __name__ == '__main__':
c()
d()
print(__name__)
如果导入未更改的test1,打印结果为:
这是函数a
这是函数b
test1
这是函数c
这是函数d
__main__
如果导入更改后的test1,打印结果为:
这是函数c
这是函数d
__main__
两次结果差异的原理:
两个py文件(test1.py和test2.py)都包含内置的变量__name__,当分别单独运行py文件时,__name__都等于__main__这个字符值。
如果将test1导入到test2,运行test2时,test1的__name__为‘test1’,等于自己的模块名。
此时test2的__name__为仍然为__main__。
进而当运行更改后的test1时,只打印__name__ == 'main’的结果。