說白了就是想做到想 注釋中介軟體一樣,存在的時候,全域性都會走那個中介軟體,不要用的時候注釋掉,除了不實現那個功能之外對全域性都不會有影響。
這就是可插拔式設計。
首先講解乙個模組importlib
這個模組的作用:以字串的形式匯入模組
module = 'file.a'
importlib.import_module(module)
上面這句就等於下面這句
from file import a
接下來就可以講一下可插拔式設計了。
首先建乙個包notify,包裡面有四個py檔案,__init__.py email.py msg.py wechat.py
然後在根目錄下寫兩個py檔案 ,乙個是 run.py 乙個是settings.py
print('郵件通知:%s'%content)
msg.py
class msg():
def __init__(self):
pass
def send(self,content):
print('簡訊通知:%s'%content)
wechat.py
class wechat():
def __init__(self):
pass
def send(self,content):
print('vx通知:%s'%content)
最重要的乙個py檔案
import settings
import importlib
def send_all(content):
for module_path in settings.notyfy_list:
module, class_name = module_path.rsplit('.',maxsplit=1)
mod = importlib.import_module(module)
# 上面這句等於from notify import email
cls = getattr(mod,class_name) #利用反射獲取模組種類的變數名
obj = cls()
obj.send(content)
總體講解:
首先寫乙個資料夾notify,在這個資料夾裡面寫了三個py檔案,分別用物件導向的方式在每個檔案裡面寫了三個通知的類,每個類都有乙個send方法,用來被呼叫。然後去settings檔案裡面把這三個類的路徑以字串的形式配置好。
然後,最重要的一步開始了,在notify資料夾裡寫了乙個__init__.py檔案,這就讓這個資料夾變成了包。匯入這個包的東西,就只用匯入這個init就行。前提是在init裡面吧那三個py檔案匯入了先。
在init 裡匯入了settings裡的配置好的字串路徑,迴圈這個字串列表,然後通過這句module, class_name = module_path.rsplit('.',maxsplit=1) 切片,module拿到的就是notify.email ,class_name拿到的就是email
然後通過importlib.import_module(module),得到的結果就是那個模組,在這裡也就是email模組。 然後又通過反射,獲取在這個模組裡的類的變數名,用cls來接收,迴圈的第一次就是 email這個類,然後obj = cls()例項化生成了乙個物件,obj.send(content)就執行了他的方法,列印了一條結果,settings裡配置了幾個,就列印幾個結果。當然我們要執行的檔案是 run檔案,run裡面就只用匯入這個包,就相當於匯入了這個包的 init 檔案,直接notify.send_all('輸出我要輸入的字元') 就行了。
這樣一來就實現了可插拔式設計,**不重要,重要的是這個思想。
自定義中介軟體實現插拔設計
不重要,重要的是這個思想 說白了就是想做到想 注釋中介軟體一樣,存在的時候,全域性都會走那個中介軟體,不要用的時候注釋掉,除了不實現那個功能之外對全域性都不會有影響。這就是可插拔式設計。首先講解乙個模組importlib 這個模組的作用 以字串的形式匯入模組 module file.a import...
利用中介軟體Multer實現上傳功能
multer中介軟體實現對multipart form data格式的資料的操作 現在實現上傳的功能,上傳檔案完成後,背景顯示上傳的 首先在html檔案中新增檔案上傳標籤 建立upload.js檔案,定義ajax上傳檔案的方法。這裡運用了xhr2的formdata物件。formdata物件可以傳送二...
分布式資料庫中介軟體DDM的實現原理
隨著資料量不斷增大,傳統的架構模式難以解決業務量不斷增長所帶來的問題,特別是在業務成線性 甚至指數級上公升的情況。此時我們不得不通過水平擴充套件,把資料庫放到不同伺服器上來解決問題,也就是我們說的資料庫中介軟體。作為資料庫中介軟體,分布式資料庫中介軟體ddm將底層資料庫儲存引擎以集群方式管理起來,使...