溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python?__all__變量怎么使用

發(fā)布時(shí)間:2023-05-09 15:16:57 來源:億速云 閱讀:112 作者:zzz 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Python __all__變量怎么使用的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

        事實(shí)上,當(dāng)我們向文件導(dǎo)入某個(gè)模塊時(shí),導(dǎo)入的是該模塊中那些名稱不以下劃線(單下劃線“_”或者雙下劃線“__”)開頭的變量、函數(shù)和類。因此,如果我們不想模塊文件中的某個(gè)成員被引入到其它文件中使用,可以在其名稱前添加下劃線。
        以前面章節(jié)中創(chuàng)建的 demo.py 模塊文件和 test.py 文件為例(它們位于同一目錄),各自包含的內(nèi)容如下所示:

#demo.py
def say():
    print("人生苦短,我學(xué)Python!")
 
def CLanguage():
    print("億速云://www.kemok4.com")
 
def disPython():
    print("Python教程://www.kemok4.com/python")
 
#test.py
from demo import *
say()
CLanguage()
disPython()

執(zhí)行 test.py 文件,輸出結(jié)果為:

人生苦短,我學(xué)Python!
億速云://www.kemok4.com
Python教程://www.kemok4.com/python

        在此基礎(chǔ)上,如果 demo.py 模塊中的 disPython() 函數(shù)不想讓其它文件引入,則只需將其名稱改為 _disPython() 或者 __disPython()。修改之后,再次執(zhí)行 test.py,其輸出結(jié)果為:

人生苦短,我學(xué)Python!
億速云://www.kemok4.com
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 文件中無法使用未引入的 disPython() 函數(shù)。

Python模塊__all__變量

        除此之外,還可以借助模塊提供的 __all__ 變量,該變量的值是一個(gè)列表,存儲(chǔ)的是當(dāng)前模塊中一些成員(變量、函數(shù)或者類)的名稱。通過在模塊文件中設(shè)置 __all__ 變量,當(dāng)其它文件以“from 模塊名 import *”的形式導(dǎo)入該模塊時(shí),該文件中只能使用 __all__ 列表中指定的成員。

也就是說,只有以“from 模塊名 import *”形式導(dǎo)入的模塊,當(dāng)該模塊設(shè)有 __all__ 變量時(shí),只能導(dǎo)入該變量指定的成員,未指定的成員是無法導(dǎo)入的。

舉個(gè)例子,修改 demo.py 模塊文件中的代碼:

def say():
    print("人生苦短,我學(xué)Python!")
 
def CLanguage():
    print("億速云://www.kemok4.com")
 
def disPython():
    print("Python教程://www.kemok4.com/python")
 
__all__ = ["say","CLanguage"]

可見,__all__ 變量只包含 say() 和 CLanguage() 的函數(shù)名,不包含 disPython() 函數(shù)的名稱。此時(shí)直接執(zhí)行  test.py 文件,其執(zhí)行結(jié)果為:

人生苦短,我學(xué)Python!
億速云://www.kemok4.com
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 文件來說,demo.py 模塊中的 disPython() 函數(shù)是未引入,這樣調(diào)用是非法的。

        再次聲明,__all__ 變量僅限于在其它文件中以“from 模塊名 import *”的方式引入。也就是說,如果使用以下 2 種方式引入模塊,則 __all__ 變量的設(shè)置是無效的。

1. 以“import 模塊名”的形式導(dǎo)入模塊。通過該方式導(dǎo)入模塊后,總可以通過模塊名前綴(如果為模塊指定了別名,則可以使用模快的別名作為前綴)來調(diào)用模塊內(nèi)的所有成員(除了以下劃線開頭命名的成員)。

仍以 demo.py 模塊文件和 test.py 文件為例,修改它們的代碼如下所示:

#demo.py
def say():
    print("人生苦短,我學(xué)Python!")
 
def CLanguage():
    print("億速云://www.kemok4.com")
 
def disPython():
    print("Python教程://www.kemok4.com/python")
 
__all__ = ["say"]
 
 
#test.py
import demo
demo.say()
demo.CLanguage()
demo.disPython()

運(yùn)行 test.py 文件,其輸出結(jié)果為:

人生苦短,我學(xué)Python!
C語言中文網(wǎng)://www.kemok4.com
Python教程://www.kemok4.com/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.kemok4.com
Python教程://www.kemok4.com/python

以上就是“Python __all__變量怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI