一、 引言
《第10.4節 Python子產品的弱封裝機制》介紹了Python子產品的的弱封裝機制,除了使用弱封裝機制來從一定程度上防止導入特定成員外,Python子產品中還提供可另外一種類似白名單的機制來控制導入的成員,這個機制就是在子產品中定義__all__變量,将__all__的值設定成一個清單,隻有清單中的子產品成員才能被導入。
二、 方法介紹
在子產品内部定義一個子產品内的全局變量__all__,其元素是每個需要允許導出的成員名字元串。
all = [‘成員名1’,…,‘成員名n’]
三、 案例
1、 我們定義一個imptest子產品,包括三個成員變量和5個成員函數,内容如下:
#imptest.py
__all__=['f','_f1','var2','_var3']
var1,var2,_var3='imptest var1','imptest var2','imptest _var3'
_var2
def f():
print("execute ftest function in imptest....")
def _f1():
print("execute _f1(單下劃線開頭) function in imptest....")
def __f2():
print("execute __f2(雙下劃線開頭) function in imptest....")
def __f3__():
print("execute __f3__(雙下劃線開頭結尾) function in imptest....")
def f4():
print("execute f4 function in imptest....")
print("Now in imptest module!")
2、 使用“from 子產品名 import *”導入imptest子產品的成員并執行驗證是否導入成功
>>> from imptest import *
Now in imptest module!
>>> var1
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
var1
NameError: name 'var1' is not defined
>>> var2
'imptest var2'
>>> _var3
'imptest _var3'
>>> f()
execute ftest function in imptest....
>>> _f1()
execute _f1(單下劃線開頭) function in imptest....
>>> __f2()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
__f2()
NameError: name '__f2' is not defined
>>>
執行截圖:

從上述執行情況來看,隻有在__all__清單中的成員才能通過“from imptest import *”導入,帶下劃線的也會正常導入,沒有在__all__清單中的成員計算無下劃線開頭也不能導入。
3、 直接使用“import 子產品名”導入
源代碼:
>>> import imptest
Now in imptest module!
>>> imptest.f()
execute ftest function in imptest....
>>> imptest._f1()
execute _f1(單下劃線開頭) function in imptest....
>>> imptest.__f2()
execute __f2(雙下劃線開頭) function in imptest....
>>> imptest.__f3__()
execute __f3__(雙下劃線開頭結尾) function in imptest....
>>> imptest.var1,imptest.var2,imptest._var3
('imptest var1', 'imptest var2', 'imptest _var3')
>>>
執行截屏:
從上述執行情況來看,使用“import 子產品名”導入後,所有成員都可以正常通路,不受__all__清單的影響。
- 隻對“from 子產品名 import *”導入産生影響,對“import 子產品名”或“from 子產品名 import 成員名”不産生影響;
- 在__all__清單中的元素不論是否帶下劃線開頭,“from 子產品名 import *”都會導入,不受子產品的預設封裝機制影響,可以說這是另一種方式的封裝;
- 在子產品定義__all__變量後,可以使用“
”檢視子產品建議使用的子產品成員。子產品.__all__