importlib
【一】介紹
- importlib 模塊是 Python 中用于動態加載和導入模塊的內置模塊。
- 它提供了一組函數和類,使得我們可以在運行時根據需要加載模塊,并且可以對已導入的模塊進行操作和管理。
【二】詳解及示例:
【1】動態加載模塊:
- importlib 模塊提供了?
import_module
?函數 - 通過該函數可以在運行時動態加載一個模塊。
- 示例代碼如下:
import importlibmodule_name = 'math' # 要加載的模塊名
math_module = importlib.import_module(module_name)
【2】導入指定模塊成員:
- importlib 模塊還提供了?
import_module
?函數的變體?import_module
- 它可以直接返回指定模塊的成員。
- 示例代碼如下:
import importlibmodule_name = 'math' # 要加載的模塊名
math_module = importlib.import_module(module_name)
sqrt_func = getattr(math_module, 'sqrt')
【3】重新加載模塊:
- 在開發過程中,我們有時需要重新加載一個已經導入的模塊,以便應用最新的修改。
- importlib 模塊提供了?
reload
?函數來實現這個功能。 - 示例代碼如下:
import importlibmodule_name = 'my_module' # 要重新加載的模塊名
my_module = importlib.import_module(module_name)
my_module = importlib.reload(my_module)
【4】獲取已導入的模塊列表:
- 通過?
sys.modules
?可以獲取當前已導入的所有模塊的字典 - 其中鍵為模塊名稱,值為模塊對象。
- 以下示例演示如何遍歷已導入的模塊列表:
import sysfor module_name, module in sys.modules.items():print(module_name, module)
【群發功能演示】
【一】引入
- 我們在Django的配置文件中,里面的中間件配置文件,雖然使用逗號分開,但是可以做到直接引入某個模塊
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]
- 這種路徑構造方式,我們就可以通過importlib模塊實現
【二】推導過程
【1.0】引入
def wechat(content):print(f"wechat接收到的通知:>>>{content}")def QQ(content):print(f"QQ接收到的通知:>>>{content}")def email(content):print(f"email接收到的通知:>>>{content}")
from send_message import *def send_all(content):wechat(content=content)QQ(content=content)email(content=content)if __name__ == '__main__':send_all("這是一條測試信息")
【2.0】升級
(1)功能部分
class WeChat(object):def __init__(self):# 發送消息前的準備工作# 比如掉接口/初始化配置等passdef send(self, content):print(f"WeChat 發送的消息 :>>>{content}")class QQ(object):def __init__(self):# 發送消息前的準備工作# 比如掉接口/初始化配置等passdef send(self, content):print(f"QQ 發送的消息 :>>>{content}")class email(object):def __init__(self):# 發送消息前的準備工作# 比如掉接口/初始化配置等passdef send(self, content):print(f"email 發送的消息 :>>>{content}")
import settings
import importlibdef send_all(content):# 拿到每一個包的路徑for path_str in settings.MODEL_LIST:model_path, class_name = path_str.rsplit('.', maxsplit=1)# model_path : model.email# class_name : email# (1)利用字符串導入模塊# models : 模塊對象models = importlib.import_module(model_path)# (2)利用反射拿到類名cls = getattr(models, class_name)# (3)生成類的對象obj = cls()# (4)利用鴨子類型直接調用send發送消息obj.send(content)if __name__ == '__main__':send_all('1')
(3)調用部分
MODEL_LIST = ['model.email.email','model.QQ.QQ','model.WeChat.WeChat',
]
import modelmodel.send_all('這是測試消息')
email 發送的消息 :>>>這是測試消息
QQ 發送的消息 :>>>這是測試消息
WeChat 發送的消息 :>>>這是測試消息