1. 程式人生 > 實用技巧 >python中的 if __name__ == "__main__": 語句的作用

python中的 if __name__ == "__main__": 語句的作用

本文純屬記錄,非本人原創,原文地址:https://www.cnblogs.com/chenhuabin/p/10118199.html

閱讀目錄

引言

  在Python當中,如果程式碼寫得規範一些,通常會寫上一句“if __name__==’__main__:”作為程式的入口,但似乎沒有這麼一句程式碼,程式也能正常執行。這句程式碼多餘嗎?原理又在哪裡?本篇博文對此進行總結說明。

2 程式入口

學過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__:”這條程式碼的意義之一。

3 模組匯入

我們知道,當我們把模組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__':”內部。

4 “__name__”與“__main__”

看到現在也許心中還是疑惑,為什麼會這樣,那麼現在我們來說一說“if __name__=='__main__':”的原理。

“__name__”是Python的內建變數,用於指代當前模組。我們修改上面用到的A模組和B模組,在模組中分別輸出模組的名稱:

  模組A:

# 模組A

print('你好,我是模組A……')

print('模組A中__name__的值:{}'.format(__name__))

print('-------------------------')


模組B:
# 模組B

from package01 import A

print('你好,我是模組B……')

print('模組B中__name__的值:{}'.format(__name__))

執行A模組時,輸出結果:

  你好,我是模組A……

  模組A中__name__的值:__main__

  -------------------------

  執行B模組時,輸出結果:

  你好,我是模組A……

  模組A中__name__的值:package01.A

  -------------------------

  你好,我是模組B……

  模組B中__name__的值:__main__

發現神奇之處了嗎?當哪個模組被直接執行時,該模組“__name__”的值就是“__main__”,當被匯入另一模組時,“__name__”的值就是模組的真實名稱。用一個類比來解釋一下:記得小時候要輪流打算教室,輪到自己的時候(模組被直接執行的時候),我們會說今天是“我”(__main__)值日,稱呼其他人時,我們就會直接喊他們的名字。所以,“__main__”就相當於當事人,或者說第一人稱的“我”。

  所以,當執行“if __name__=='__main__':”語句時,如果當前模組時被直接執行,__name__的值就是__main__,條件判斷的結果為True,“if __name__=='__main__':”下面的程式碼塊就會被執行。

5 總結

if __name__=='__main__':

直接運行當前檔案時,當前檔案的(__name__)模組名就是__main__,當檔案被匯入到其它模組在其它模組執行時,被匯入的模組的檔名就是其真正的模組名。故在當前檔案直接執行程式碼時,if __name__=='__main__':語句中的條件將成立,將會執行if條件語句下的程式碼塊,當檔案被匯入到其它模組且在其它模組執行時 if 語句中的條件將不成立,則不會執行 if 語句下的程式碼塊;if __name__=='__main__': 語句一般用在測試當前檔案中的類或函式的邏輯是否正確(將測試程式碼放在if __name__=='__main__': 語句下),可以用於除錯單個模組,當模組被匯入到其它模組後將不會執行測試程式碼塊,不會影響模組之間的呼叫。