第10 4節 Python模組的弱封裝機制

2021-09-26 00:02:49 字數 2329 閱讀 9038

一、 引言

python模組可以為呼叫者提供模組內成員的訪問和呼叫,但某些情況下, 因為某些成員可能有特殊訪問規則等原因,並不適合將模組內所有成員都提供給呼叫者訪問,此時模組可以類似類的封裝機制類似的模式提供一定的內部成員保護。

模組內的內部成員封裝機制有兩種,一種是定義類似類的私有成員,二是類似類的__slots__例項屬性白名單機制,下面分別介紹這兩種方法。

二、 定義模組的私有成員

在模組內,乙個以下劃線開頭的成員屬於模組的私有成員,在使用「from 模組名 import *」不會被匯入,這和類的私有成員管理比較像,但還是有如下區別:

1、 下劃線開頭的成員包括了單下劃線開頭、雙下劃線開頭、雙下劃線開頭雙下劃線結尾的成員,它們的處理是一樣的,而類中它們是不一樣的,具體大家可參考《第7.8節 python中隱秘的類封裝方法》;

2、 模組的私有成員使用「from 模組名 import *」這樣的語句來匯入模組時,程式會跳過下劃線開頭的模組成員,即下劃線開頭的所有成員都不能「from 模組名 import *」匯入,但可以通過「import 模組名」或「from 模組名 import 成員」方式匯入。

python通過這種簡單的名字規則來隱藏成員的方法就是模組的封裝機制,可以看到其實這種封裝機制很脆弱。

3、 案例:

我們定義乙個imptest.py,檔案內容如下:

#imptest.py

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....")

print("now in imptest module!")

1)使用「from 模組名 import *」匯入並呼叫成員執行驗證是否匯入成功:

>>> from imptest import *

now in imptest module!

>>> f()

execute ftest function in imptest....

>>> _f1()

traceback (most recent call last):

file "", line 1, in _f1()

nameerror: name '_f1' is not defined

>>> __f2()

traceback (most recent call last):

file "", line 1, in __f2()

nameerror: name '__f2' is not defined

>>> __f3__()

traceback (most recent call last):

file "", line 1, in __f3__()

nameerror: name '__f3__' is not defined

>>>

可以看到凡是帶下劃線的都沒有匯入。

2) 使用「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....

可以看到都能正常匯入使用。

本節介紹了模組中使用下劃線開頭定義成員能防止「from 模組名 import *」匯入這些成員,這是一種python提供的弱封裝機制,但建議大家在使用時還是遵循這種機制。

Python模組分析 第3節 typing模組

python模組分析 第2節 hashlib加密模組 python模組分析 第4節 logging日誌模組 python是一門弱型別的語言,很多時候我們可能不清楚函式引數型別或者返回值型別,很有可能導致一些型別沒有指定方法,typing模組可以很好的解決這個問題。該模組加入並不會影響程式的執行,不會...

第10 3節 Python匯入模組能否取消匯入?

模組匯入後,是否可以取消匯入?實際上當模組匯入後,是無法逆向還原到匯入前的狀態的,但是可以利用 del 模組名 進行匯入模組的刪除,此時的刪除只是刪除了匯入模組對應的模組變數名,刪除後在呼叫時找不到模組了,但並沒有真正刪除整個匯入模組。為什麼這麼說呢?這是因為刪除後與刪除前python系統內相關的處...

第12 5節 Python time模組導覽

epoch 是時間開始的點,並且取決於平台。對於unix,epoch 是1970年1月1日00 00 00 utc 要找出給定平台上的 epoch 請檢視 time.gmtime 0 術語 unix 紀元秒數 是指自國際標準時間 1970 年 1 月 1 日零時以來經過的總秒數,通常不包括 閏秒。在...