1. 【Python】if name == '__main__'究竟有什么作用?

        共 2467字,需瀏覽 5分鐘

         ·

        2022-11-01 12:34

        1前言

        在很多的源碼中,我們經(jīng)??梢钥吹接幸痪湓?/p>

        if __name__ == '__main__':

        但是我們在運(yùn)行的時(shí)候,又會(huì)發(fā)現(xiàn)把這句話刪掉的時(shí)候卻又不影響代碼的執(zhí)行,那為什么要加這么一句話呢?

        本文將進(jìn)一步介紹“if name == '__main__'”這命令的含義,以及在實(shí)際項(xiàng)目中如何應(yīng)用。

        2__name__的作用

        python的變量中,分別有單下劃線_xxx,雙下劃線__xxx,以及變量前后均有雙下劃線__xxx__

        系統(tǒng)定義名字,一般前后均有一個(gè)“雙下劃線”來代表python里特殊方法專用的標(biāo)識,如__init__0代表類的構(gòu)造函數(shù)。類似__xxx__這樣的變量一般是特殊變量,可以被直接引用,但是有特殊用途,而__name__就是這樣一個(gè)特殊變量,它是python的一個(gè)內(nèi)置類屬性,它天生就存在于一個(gè) python 程序中。

        1.當(dāng)我們直接運(yùn)行python程序時(shí),程序的__name__就是等于'__main__'

        有程序腳本“A.py”,代碼如下,

        def myfun1():
            print('從A中調(diào)用myfun1')
            print('A_name:', __name__)

        myfun1()

        直接執(zhí)行代碼,得到結(jié)果輸出:

        image-20220618195714681

        2.當(dāng)我們運(yùn)行python程序?qū)肫渌?py文件時(shí),導(dǎo)入其他文件的__name__就是等于模塊名

        除A.py外,我們有另一腳本run_code.py,我們使用它來調(diào)用A.py,此處我們直接import A即可

        import A

        我們看看輸出:

        image-20220618220705785

        可以看到輸出的形式基本就是一致的,但不一樣的是__name__不再等于'__main__'而是為文件名字“A”。

        3 if __name__=='__main__'在項(xiàng)目的應(yīng)用

        值得注意的是,我們剛剛并沒有使用A.py中的函數(shù),只是import,python也會(huì)輸出結(jié)果。讓我們再次回顧我們的兩個(gè)腳本:

        A.py

        def myfun1():
            print('從A中調(diào)用myfun1')
            print('A_name:', __name__)

        myfun1()

        run_code.py

        import A

        實(shí)際上,即使我們import A,同樣也會(huì)把A的腳本執(zhí)行。那么,如果我們在run_code.py腳本中調(diào)用函數(shù)會(huì)得到什么結(jié)果?我們把run_code.py修改如下:

        import A

        print('從run_code中調(diào)用myfun1')
        A.myfun1()

        輸出結(jié)果如下:

        image-20220618221205979

        接下來,我們分析每個(gè)輸出的出處。

        第一句及第二句輸出,是由于import A過程中,執(zhí)行A.py腳本中的“myfun1()”函數(shù)得到的,所以得到:

        從A中調(diào)用myfun1
        A_name: A

        第三句輸出,則是run_code.py腳本中的命令“print('從run_code中調(diào)用myfun1')”得到的輸出

        從run_code中調(diào)用myfun1

        第四句及第五句輸出,則是從run_code.py腳本中的命令“A.myfun1()”執(zhí)行A中的“myfun1()”函數(shù)得到的輸出

        從A中調(diào)用myfun1
        A_name: A

        實(shí)際上,A.py這個(gè)文件本來只是一個(gè)函數(shù)文件,A.py中“myfun1()”這個(gè)命令,是我們在撰寫這個(gè)函數(shù)的時(shí)候的測試命令,那么這就產(chǎn)生一個(gè)問題,當(dāng)我們在其他程序中調(diào)用這個(gè)模塊的時(shí)候,這一句測試內(nèi)容就會(huì)被打印出來。

        我們當(dāng)然可以把上面的測試語句刪除,但是一般情況下,我們后續(xù)可能還會(huì)對原始的代碼進(jìn)行修改,那么修改后,這些測試代碼又要重新被添加上,那么就顯得有點(diǎn)麻煩了。

        那么在這種情況下,我們就可以在這些測試代碼前加上:

        if __name__ == '__main__':

        根據(jù)我們前面討論__name__的特性,就可以使得我們在測試的時(shí)候,運(yùn)行測試語句,而當(dāng)我們調(diào)用的時(shí)候,不再運(yùn)行這些測試語句。

        我們對A.py進(jìn)行改寫:

        def myfun1():
            print('從A中調(diào)用myfun1')
            print('A_name:', __name__)

        #myfun1()

        if __name__ == '__main__':#當(dāng)作為模塊被導(dǎo)入時(shí),不執(zhí)行
            myfun1()

        執(zhí)行輸出結(jié)果有:

        image-20220618222222096

        run_code.py不用修改。現(xiàn)在,我們再執(zhí)行run_code.py

        image-20220618222253868

        可以發(fā)現(xiàn),測試的語句已經(jīng)沒有再被輸出了。

        4 總結(jié)

        初始接觸python的時(shí)候,我們往往困惑“if name == '__main__'”這句似乎沒有任何作用的語句為什么要加上去。但是相信經(jīng)過上面的講解,大家也對python的模塊管理有了更深刻的認(rèn)識,也明白在實(shí)際使用中,我們該如何運(yùn)用“if name == '__main__'”這個(gè)語句了。

        剛接觸Python,練習(xí)編寫的程序/模塊通常是直接運(yùn)行,該語句沒有起到實(shí)質(zhì)性的作用。因此會(huì)對其作用有些困惑。有模塊的概念,自己嘗試做一些模塊封裝,就會(huì)很好理解了。


        3.使用watch窗口添加關(guān)注變量

        往期精彩回顧




        瀏覽 74
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 成人永久| 日韩一页 | 免费一级大黄片 | 一级欧美一级日韩片 | 欧美午夜AⅤ无码精品色情综艺 |