在Python程序中,你會經(jīng)??吹絖_name__,例如:
if __name__ == '__main__': main()
本文將介紹如何正確使用和理解這個變量。
請注意,__name__在程序中是一個變量,只不過這個變量的命名有點(diǎn)奇怪,用雙下劃線開頭和結(jié)尾。這種命名的方法,在Pyhton的類對象設(shè)計中,常常用于一些具有特殊作用的屬性或者方法名稱[2]。
如果將編寫的一個Python文件,即.py為擴(kuò)展名的文件,作為模塊被其他程序引入的時候,我們需要通過__name__這個變量,決定在引入的時候是否要運(yùn)行該文件。
例如創(chuàng)建一個文件namescript.py,內(nèi)容如下:
def my_function(): print('the value of __name__ is ' + __name__) def main(): my_function() if __name__ == "__main__": main()
如果執(zhí)行namescript.py文件,其執(zhí)行流程如下:
在程序中的代碼被執(zhí)行之前,Python解析器先給__name__變量賦值為__main__。然后逐行執(zhí)行程序中的代碼。注意,當(dāng)執(zhí)行到第7行的時候,判斷__name__的值是否為__main__,如果條件為真,就執(zhí)行main()這個前面自定義的函數(shù),并最終打印出結(jié)果。
如果將namescript.py文件作為一個模塊,在另外一個文件中引入,例如在名為importingscript.py的文件中,有代碼:
import namescript as nsns.my_function()
這樣,就在importingscript.py文件中使用了namescript.py文件中定義的函數(shù)my_function。如此,避免了重復(fù)代碼,而且提升了開發(fā)效率。這是Python語言的重要特點(diǎn)。
如果執(zhí)行importscript.py文件,其流程如下圖所示:
在importscript.py中,變量__name__被賦值為__main__,然后執(zhí)行import namescript,Python解析器會自動在模塊名字后面增加.py并在檢索目錄中查找該文件——所以,在引入模塊的時候不要寫成import namescript.py。找到了,就引入該文件中的所有代碼。
然后,將namescript.py文件所運(yùn)行的空間中的__name__設(shè)置為namescript。結(jié)合上圖,在importingscript.py和namescript.py中,分別有兩個同名的__name__變量,但是,它們的值不同。如此,在namescript.py中,因?yàn)開_name__的值是namescript了,于是該文件中的if __name__ == "__main__"條件不再成立,所以此條件下的main()函數(shù)不再執(zhí)行。
在importingscript.py中,調(diào)用了namescript.my_function(),打印的結(jié)果是:the value of __name__ is namescript,這里的__name__當(dāng)然是namescript.py中的變量。
如果在importingscript.py中,增加print(__name__),打印出來的結(jié)果應(yīng)該是__main__。