Python中if __name__ == '__main__':的作用和原理
- 前言
- 1. __name__的理解
- 1.1 為什么使用__name__屬性?
- 1.2 __name__屬性
- 2. 模塊匯入
- 3. `__name__與"__main__"`
- 4. `if __name__ == '__main__':`的作用
- 5. 又一例子
前言
學過Java、C、C++的程式員應該都知道,每次開啟一個程式,都必須寫一個主函式作為程式的入口,也就是我們常說的main函式,如下所示, main()就是Java中的一個main函式,
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
與Java、C、C++等幾種語言不同的是,Python是一種解釋型腳本語言,在執行之前不同要將所有代碼先編譯成中間代碼,Python程式運行時是從模塊頂行開始,逐行進行翻譯執行,所以,最頂層(沒有被縮進)的代碼都會被執行,所以Python中并不需要一個統一的main()作為程式的入口,在某種意義上講,"if __name__==’__main__:"也像是一個標志,象征著Java等語言中的程式主入口,告訴其他程式員,代碼入口在此——這是“if __name__==’__main__:”這條代碼的意義之一,
1. __name__的理解
1.1 為什么使用__name__屬性?
Python解釋器在匯入模塊時,會將模塊中沒有縮進的代碼全部執行一遍(模塊就是一個獨立的Python檔案),開發人員通常會在模塊下方增加一些測驗代碼,為了避免這些測驗代碼在模塊被匯入后執行,可以利用__name__屬性,
1.2 __name__屬性
__name__屬性是Python的一個內置屬性,記錄了一個字串,
- 若是在當前檔案,name 是__main__,
- 在hello檔案中列印本檔案的__name__屬性值,顯示的是__main__

- 若是匯入的檔案,__name__是模塊名,
- test檔案匯入hello模塊,在test檔案中列印出hello模塊的__name__屬性值,顯示的是hello模塊的模塊名,

因此__name__ == '__main__'就表示在當前檔案中,可以在if __name__ == '__main__':條件下寫入測驗代碼,如此可以避免測驗代碼在模塊被匯入后執行,
2. 模塊匯入
我們知道,當我們把模塊A中的代碼在模塊B中進行import A時,只要B模塊代碼運行到該import陳述句,模塊A的代碼會被執行,
模塊A:
# 模塊A
a = 100
print('你好,我是模塊A……')
print(a)
模塊B:
# 模塊B
from package01 import A
b = 200
print('你好,我是模塊B……')
print(b)
運行模塊B時,輸出結果如下:
你好,我是模塊A……
100
你好,我是模塊B……
200
如果在模塊A中,我們有部分的代碼不想在被匯入到B時直接被運行,但在直接運行A時可直接運行,那該怎么做呢?那就可以用到“if __name__==’__main__:”這行代碼了,我們隊上面用到的A模塊代碼進行修改:
A模塊代碼修改為:
# 模塊A
a = 100
print('你好,我是模塊A……')
if __name__=='__main__':
print(a)
B模塊不做修改,直接執行B模塊,輸出結果如下:
你好,我是模塊A……
你好,我是模塊B……
200
看到了嗎,A模塊中的a的值就沒有再被輸出了,所以,當你要匯入某個模塊,但又不想改模塊的部分代碼被直接執行,那就可以這一部分代碼放在“if __name__=='__main__':”內部,
3. __name__與"__main__"
看到現在也許心中還是疑惑,那么現在我們來說一說“if__name__=='__main__':”的原理,
“__name__”是Python的內置變數,用于指代當前模塊,我們修改上面用到的A模塊和B模塊,在模塊中分別輸出模塊的名稱:
模塊A:
# 模塊A
print('你好,我是模塊A……')
print('模塊A中__name__的值:{}'.format(__name__))
print('-------------------------')
輸出結果:
你好,我是模塊A……
模塊A中__name__的值:__main__
-------------------------
模塊B:
# 模塊B
from package01 import A
print('你好,我是模塊B……')
print('模塊B中__name__的值:{}'.format(__name__))
輸出結果:
你好,我是模塊A……
模塊A中__name__的值:package01.A
-------------------------
你好,我是模塊B……
模塊B中__name__的值:__main__
當哪個模塊被直接執行時,該模塊“__name__”的值就是“__main__”,當被匯入另一模塊時,“__name__”的值就是模塊的真實名稱,
4. if __name__ == '__main__':的作用
python檔案通常有兩種使用方法:
第一是作為腳本直接執行
第二是 import 到其他的 python 腳本中被呼叫(模塊重用)執行,
因此 if __name__ == 'main':的作用就是控制這兩種情況執行代碼的程序,在 if __name__ == 'main':下的代碼只有在第一種情況下(即檔案作為腳本直接執行,在當前檔案下執行代碼)才會被執行,而 import 到其他腳本中是不會被執行的,
5. 又一例子
1. add_.py
# 定義一個實作加法功能的py代碼
def add(a, b):
return a + b
res = add(2, 3)
print(res)
2. use_py
# 定義另一個py代碼,匯入add_.py中的add方法,類似模塊匯入
from add_ import add
res = add(2, 3)
print(f'結果是:{res}') # fiill a value
列印結果:
5
5
我們只想要一個結果5,但是輸出兩個,把第一個py代碼中測驗代碼,放在__name__=='main’中,use.py執行add()就不會執行測驗代碼了!
if __name__=='__main__':
res = add(2, 3)
print(res)
運行use.py,輸出結果:
5
參考:Link
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301029.html
標籤:java
