天天看點

第10.5節 使用__all__定義Python子產品導入白名單

一、 引言

《第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
>>>
           

執行截圖:

第10.5節 使用__all__定義Python子產品導入白名單

從上述執行情況來看,隻有在__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')
>>>
           

執行截屏:

第10.5節 使用__all__定義Python子產品導入白名單

從上述執行情況來看,使用“import 子產品名”導入後,所有成員都可以正常通路,不受__all__清單的影響。

  1. 隻對“from 子產品名 import *”導入産生影響,對“import 子產品名”或“from 子產品名 import 成員名”不産生影響;
  2. 在__all__清單中的元素不論是否帶下劃線開頭,“from 子產品名 import *”都會導入,不受子產品的預設封裝機制影響,可以說這是另一種方式的封裝;
  3. 在子產品定義__all__變量後,可以使用“

    子產品.__all__

    ”檢視子產品建議使用的子產品成員。
上一篇: 緩存
下一篇: 緩存

繼續閱讀