日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单

發布時間:2023/12/19 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python白名单验证是什么意思_第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 "", line 1, in

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 "", line 1, in

__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__列表的影響。

四、總結

使用__all__定義模塊訪問白名單:

只對“from 模塊名 import *”導入產生影響,對“import 模塊名”或“from 模塊名 import 成員名”不產生影響;

在__all__列表中的元素不論是否帶下劃線開頭,“from 模塊名 import *”都會導入,不受模塊的缺省封裝機制影響,可以說這是另一種方式的封裝;

在模塊定義__all__變量后,可以使用“模塊.__all__”查看模塊建議使用的模塊成員。

__all__變量可以認為給模塊定義了一個開放的公共接口。通常來說,只有__all__變量列出的模塊屬性,才是該模塊建議外界使用的。因此,為一個大模塊定義__all__ 變量,就可以給調用程序建議過濾不需要使用的變量、函數和類,只使用__all__定義的白名單屬性。

前面章節介紹過 dir(模塊名)可返回模塊或類所包含的全部程序單元(包括變量、函數、類和方法等),但直接使用 dir() 函數默認會列出模塊內所有的屬性,包括以下劃線開頭的屬性,如果模塊定義了__all__ 變量,則建議調用者只關注__all__ 變量限定的屬性。

總結

以上是生活随笔為你收集整理的python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。