1.引言
在Python當中,如果代碼寫得規範一些,通常會寫上一句if __name__ == "__main__":作爲程序的入口.
但似乎沒有這麼一句代碼,程序也能正常運行。
這句代碼多餘嗎?原理又在哪裏?本篇博文對此進行總結說明。
2.2個模塊正常調用
我們知道,當我們把模塊A中的代碼在模塊B中進行import A時,只要B模塊代碼運行到該import語句,模塊A的代碼會被執行。
# @File : test2.py
class A:
a = 100
print('你好,我是模塊A……')
print(a)
運行結果:
你好,我是模塊A……
100
# @File : test4.py
from test2 import A
class B:
b = 200
print('你好,我是模塊B……')
print(b)
運行結果:
你好,我是模塊A……
100
你好,我是模塊B……
200
3.2個模塊通過if __name__ == "__main__":進行調用
如果在模塊A中,我們有部分的代碼不想在被導入到B時直接被運行,但在直接運行A時可直接運行,那該怎麼做呢?
那就可以用到if __name__ == "__main__":這行代碼了,我們對上面用到的A模塊代碼進行修改,B保持原樣:
# @File : test2.py
class A:
a = 100
print('你好,我是模塊A……')
if __name__ == "__main__":
print(a)
運行結果:
你好,我是模塊A……
100
# @File : test4.py
from test2 import A
class B:
b = 200
print('你好,我是模塊B……')
print(b)
運行結果:
你好,我是模塊A……
你好,我是模塊B……
200
看到了嗎,A模塊中的a的值就沒有再被輸出了。
所以,當你要導入某個模塊,但又不想改模塊的部分代碼被直接執行,那就可以這一部分代碼放在if __name__ == "__main__":內部。
4.__name__ == "__main__"到底是什麼關係
__name__是Python的內置變量,用於指代當前模塊。
我們修改上面用到的A模塊和B模塊,在模塊中分別輸出模塊的名稱:
# @File : test2.py
class A:
print('你好,我是模塊A……')
print('模塊A中__name__的值:{}'.format(__name__))
運行結果:
你好,我是模塊A……
模塊A中__name__的值:__main__
# @File : test4.py
from test2 import A
class B:
print('你好,我是模塊B……')
print('模塊B中__name__的值:{}'.format(__name__))
運行結果:
你好,我是模塊A……
模塊A中__name__的值:test2
你好,我是模塊B……
模塊B中__name__的值:__main__
當哪個模塊被直接執行時,該模塊“__name__”的值就是“__main__”。
當被導入另一模塊時,“__name__”的值就是該模塊的真實名稱。
5.總結
所以,如果當前模塊A時直接執行,運行“if __name__ == "__main__":語句時,__name__的值就是__main__,結果是True,if __name__ == "__main__":下面的代碼塊就會被執行。
但是被引入時模塊B時,__name__的值就是A,結果是False,if __name__ == "__main__":下面的代碼塊不會被執行。