Python – __all__ 變數

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/