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 发送的消息 :>>>这是测试消息