Python?__all__變量用法示例詳解
事實(shí)上,當(dāng)我們向文件導(dǎo)入某個(gè)模塊時(shí),導(dǎo)入的是該模塊中那些名稱(chēng)不以下劃線(xiàn)(單下劃線(xiàn)“_”或者雙下劃線(xiàn)“__”)開(kāi)頭的變量、函數(shù)和類(lèi)。因此,如果我們不想模塊文件中的某個(gè)成員被引入到其它文件中使用,可以在其名稱(chēng)前添加下劃線(xiàn)。
以前面章節(jié)中創(chuàng)建的 demo.py 模塊文件和 test.py 文件為例(它們位于同一目錄),各自包含的內(nèi)容如下所示:
#demo.py def say(): print("人生苦短,我學(xué)Python!") def CLanguage(): print("腳本之家://www.dbjr.com.cn") def disPython(): print("Python教程://www.dbjr.com.cn/python") #test.py from demo import * say() CLanguage() disPython()
執(zhí)行 test.py 文件,輸出結(jié)果為:
人生苦短,我學(xué)Python!
腳本之家://www.dbjr.com.cn
Python教程://www.dbjr.com.cn/python
在此基礎(chǔ)上,如果 demo.py 模塊中的 disPython() 函數(shù)不想讓其它文件引入,則只需將其名稱(chēng)改為 _disPython() 或者 __disPython()。修改之后,再次執(zhí)行 test.py,其輸出結(jié)果為:
人生苦短,我學(xué)Python!
腳本之家://www.dbjr.com.cn
Traceback (most recent call last):
File "C:/Users/mengma/Desktop/2.py", line 4, in <module>
disPython()
NameError: name 'disPython' is not defined
顯然,test.py 文件中無(wú)法使用未引入的 disPython() 函數(shù)。
Python模塊__all__變量
除此之外,還可以借助模塊提供的 __all__ 變量,該變量的值是一個(gè)列表,存儲(chǔ)的是當(dāng)前模塊中一些成員(變量、函數(shù)或者類(lèi))的名稱(chēng)。通過(guò)在模塊文件中設(shè)置 __all__ 變量,當(dāng)其它文件以“from 模塊名 import *”的形式導(dǎo)入該模塊時(shí),該文件中只能使用 __all__ 列表中指定的成員。
也就是說(shuō),只有以“from 模塊名 import *”形式導(dǎo)入的模塊,當(dāng)該模塊設(shè)有 __all__ 變量時(shí),只能導(dǎo)入該變量指定的成員,未指定的成員是無(wú)法導(dǎo)入的。
舉個(gè)例子,修改 demo.py 模塊文件中的代碼:
def say(): print("人生苦短,我學(xué)Python!") def CLanguage(): print("腳本之家://www.dbjr.com.cn") def disPython(): print("Python教程://www.dbjr.com.cn/python") __all__ = ["say","CLanguage"]
可見(jiàn),__all__ 變量只包含 say() 和 CLanguage() 的函數(shù)名,不包含 disPython() 函數(shù)的名稱(chēng)。此時(shí)直接執(zhí)行 test.py 文件,其執(zhí)行結(jié)果為:
人生苦短,我學(xué)Python!
腳本之家://www.dbjr.com.cn
Traceback (most recent call last):
File "C:/Users/mengma/Desktop/2.py", line 4, in <module>
disPython()
NameError: name 'disPython' is not defined
顯然,對(duì)于 test.py 文件來(lái)說(shuō),demo.py 模塊中的 disPython() 函數(shù)是未引入,這樣調(diào)用是非法的。
再次聲明,__all__ 變量?jī)H限于在其它文件中以“from 模塊名 import *”的方式引入。也就是說(shuō),如果使用以下 2 種方式引入模塊,則 __all__ 變量的設(shè)置是無(wú)效的。
1. 以“import 模塊名”的形式導(dǎo)入模塊。通過(guò)該方式導(dǎo)入模塊后,總可以通過(guò)模塊名前綴(如果為模塊指定了別名,則可以使用模快的別名作為前綴)來(lái)調(diào)用模塊內(nèi)的所有成員(除了以下劃線(xiàn)開(kāi)頭命名的成員)。
仍以 demo.py 模塊文件和 test.py 文件為例,修改它們的代碼如下所示:
#demo.py def say(): print("人生苦短,我學(xué)Python!") def CLanguage(): print("腳本之家://www.dbjr.com.cn") def disPython(): print("Python教程://www.dbjr.com.cn/python") __all__ = ["say"] #test.py import demo demo.say() demo.CLanguage() demo.disPython()
運(yùn)行 test.py 文件,其輸出結(jié)果為:
人生苦短,我學(xué)Python!
C語(yǔ)言中文網(wǎng)://www.dbjr.com.cn
Python教程://www.dbjr.com.cn/python
可以看到,雖然 demo.py 模塊文件中設(shè)置有 __all__ 變量,但是當(dāng)以“import demo”的方式引入后,__all__ 變量將不起作用。
2. 以“from 模塊名 import 成員”的形式直接導(dǎo)入指定成員。使用此方式導(dǎo)入的模塊,__all__ 變量即便設(shè)置,也形同虛設(shè)。
仍以 demo.py 和 test.py 為例,修改 test.py 文件中的代碼,如下所示:
from demo import say from demo import CLanguage from demo import disPython say() CLanguage() disPython()
運(yùn)行 test.py,輸出結(jié)果為:
人生苦短,我學(xué)Python!
腳本之家://www.dbjr.com.cn
Python教程://www.dbjr.com.cn/python
到此這篇關(guān)于Python __all__變量用法的文章就介紹到這了,更多相關(guān)Python __all__變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python高階函數(shù)map()和reduce()實(shí)例解析
這篇文章主要介紹了python高階函數(shù)map()和reduce()實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Python算法之求n個(gè)節(jié)點(diǎn)不同二叉樹(shù)個(gè)數(shù)
本文先向大家分享了建立二叉樹(shù)的簡(jiǎn)單代碼,其次介紹了Python計(jì)算n個(gè)節(jié)點(diǎn)不同二叉樹(shù)個(gè)數(shù)的問(wèn)題及實(shí)現(xiàn)代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10詳解Python的Django框架中的模版相關(guān)知識(shí)
這篇文章主要介紹了Python的Django框架中的模版相關(guān)知識(shí),模版的存在大大簡(jiǎn)化了創(chuàng)作頁(yè)面時(shí)HTML的相關(guān)工作,需要的朋友可以參考下2015-07-07pytorch加載自己的圖片數(shù)據(jù)集的2種方法詳解
數(shù)據(jù)預(yù)處理在解決深度學(xué)習(xí)問(wèn)題的過(guò)程中,往往需要花費(fèi)大量的時(shí)間和精力,下面這篇文章主要給大家介紹了關(guān)于pytorch加載自己的圖片數(shù)據(jù)集的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06python中zip()函數(shù)遍歷多個(gè)列表方法
在本篇文章里小編給大家整理的是一篇關(guān)于python中zip()函數(shù)遍歷多個(gè)列表方法,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。2021-02-02