基於Django框架的程式設計思想
阿新 • • 發佈:2022-03-29
在Django框架中,我們可以看到,通過在settings檔案中的某個配置列表內新增上對應的字串,就相當於匯入了某個模組裡面的類功能,如下:
從上圖中我們可以看出來,Django配置檔案中的字串其實就是某個模組功能,那麼,他是如何做到的,我們能不能像Django一樣通過字串來匯入模組呢??當然可以,在這之前,我們需要來了解一個模組功能:importlib
importlib
importlib就是可以通過字串來匯入模組,具體功能如下程式碼演示:
1 ''' 2 設定一個myfile資料夾,資料夾內包含一個b.py檔案,
myfile資料夾與當前檔案在同一層級 3 ''' 45 # 模組:importlib 6 import importlib 7 res = 'myfile.b' 8 ret = importlib.import_module(res) # from myfile import b 9 # 該方法最小隻能到py檔名 10 print(ret)
從上面的程式碼演示結果來看,我們就可以通過字串的形式匯入模組,下面,我們開始利用該模組功能來模擬Django的配置檔案程式設計思想。
Django配置檔案程式設計思想:
首先我們先建立如下圖所示的檔案:其中notify是一個包,包中包含了__init__.py 、email.py 、 qq.py 以及wechat.py等檔案,並在跟notify同一層級建立了settings.py和start.py兩個py檔案:
檔案中的具體程式碼如下:
1 ''' 2 基於Django的程式設計思想,在配置檔案的列表中配置字串,就可以匯入某個功能: 3 目錄如下: 4 notify資料夾 5 __init__.py 6 email.py 7 qq.py 8 wechat.py 9 start.py 10 settings.py 11 12 ''' 13 14 # settings.py 15 import notify 16 17 path_str = [ 18 'notify.email.Email', 19 'notify.qq.QQ', 20 'notify.wechat.Wechat', 21 'notify.msn.Msn', 22 ] 23 24 ******************************************************************* 25 # email.py 其他的qq/wechat同 26 class Email(object): 27 def __init__(self): 28 pass # 傳送qq前期需要的準備工作 29 30 def send(self,content): 31 print('郵箱傳送的訊息:%s' % content) 32 33 ******************************************************************* 34 # __init__.py 35 import settings 36 import importlib 37 38 def send_all(content): 39 for path_str in settings.NOTIFY_LIST: #'notify.email.Email' 40 module_path,class_name = path_str.rsplit('.',maxsplit=1) 41 # module_path = 'notify.email' class_name = 'Email' 42 # 1 利用字串匯入模組 43 module = importlib.import_module(module_path) # from notify import email 44 # 2 利用反射獲取類名 45 cls = getattr(module,class_name) # Email、QQ、Wechat 46 # 3 生成類的物件 47 obj = cls() 48 # 4 利用鴨子型別直接呼叫send方法 49 obj.send(content) 50 51 ****************************************************************** 52 53
這樣,我們只需要在start.py中傳入content引數,就可以通過qq / email / wechat等傳送訊息,如果不想使用某個功能,只需要去配置檔案中將對應的配置註釋掉即可,新增其他的功能時也一樣,我們只需要在notify包中將功能模組寫好,然後去配置檔案中配置相對應的配置資訊即可,這大大加強了我們程式的解耦合程度。