Python – __all__ 變數
- 2021 年 10 月 12 日
- 筆記
- Python, 測試進階知識系列 - Python
import *
- 當我們向文件導入某個模組時,導入的是該模組中那些名稱不以下劃線(單下劃線 _ 或者雙下劃線 __ )開頭的變數、函數和類
- 因此,如果不想模組文件中的某個對象被引入到其它文件中使用,可以在其名稱前添加下劃線
- 下面就來講下 import * 的栗子
demo.py
def say(): print("人生苦短,我學Python!")
def disPython(): print("小菠蘿教程://www.cnblogs.com/poloyy/")
test.py
from demo import * say() disPython()
執行結果
人生苦短,我學Python!
小菠蘿教程:https://www.cnblogs.com/poloyy/
如果對象不想被引入呢
如果 demo.py 模組中的 disPython() 函數不想讓其它文件引入,則只需將其名稱改為 _disPython() 或者 __disPython()
再次執行 test.py,輸出結果
人生苦短,我學Python! Traceback (most recent call last): File "C:/Users/polo/Desktop/2.py", line 4, in <module> disPython() NameError: name 'disPython' is not defined
test.py 文件中無法使用未引入的 disPython() 函數
Python 模組 __all__ 變數
- 模組提供的 __all__ 變數,該變數的值是一個列表,存儲的是當前模組中一些對象成員(變數、函數或者類)的名稱(字元串格式)
- 通過在模組文件中設置 __all__ 變數,當其它文件以 from 模組名 import * 的形式導入該模組時,該文件中只能使用 __all__ 列表中指定的對象成員,未指定的成員是無法導入的
demo.py
def say(): print("人生苦短,我學Python!") def disPython(): print("小菠蘿教程://www.cnblogs.com/poloyy/")
__all__ = ["say"]
__all__ 變數只包含 say()的函數名,不包含 disPython() 函數的名稱
test.py
from demo import * say() disPython()
運行 test.py
人生苦短,我學Python! 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() 函數是未引入,這樣調用是非法的
- 重點:__all__ 變數僅限於在其它文件中以 from 模組名 import * 的方式引入
使用以下 2 種方式引入模組,__all__ 變數是無效的
方式一
import 模組名 的形式導入模組,通過該方式導入模組後,總可以通過模組名前綴(如果為模組指定了別名,則可以使用模快的別名作為前綴)來調用模組內的所有成員(除了以下劃線開頭命名的成員)
demo.py
def say(): print("人生苦短,我學Python!") def disPython(): print("小菠蘿教程://www.cnblogs.com/poloyy/") __all__ = ["say"]
test.py
import demo demo.say() demo.disPython()
運行 test.py
人生苦短,我學Python!
小菠蘿教程://www.cnblogs.com/poloyy/
雖然 demo.py 模組中設置有 __all__ 變數,但是當以 import demo 的方式引入後,__all__ 變數將不起作用
方式二
from 模組名 import 對象成員 的形式直接導入指定成員,使用此方式導入的模組,__all__ 變數即便設置,也不起作用
demo.py
仍然是上面的 demo 程式碼
test.py
from demo import say from demo import disPython say() disPython()
運行 test.py
人生苦短,我學Python!
小菠蘿教程:https://www.cnblogs.com/poloyy/