【模块补充】importlib

importlib

【一】介绍

  • importlib 模块是 Python 中用于动态加载和导入模块的内置模块。
  • 它提供了一组函数和类,使得我们可以在运行时根据需要加载模块,并且可以对已导入的模块进行操作和管理。

【二】详解及示例:

【1】动态加载模块:

  • importlib 模块提供了 import_module 函数
  • 通过该函数可以在运行时动态加载一个模块。
  • 示例代码如下:
python 复制代码
import importlib
 
module_name = 'math'  # 要加载的模块名
math_module = importlib.import_module(module_name)

【2】导入指定模块成员:

  • importlib 模块还提供了 import_module 函数的变体 import_module
  • 它可以直接返回指定模块的成员。
  • 示例代码如下:
python 复制代码
import importlib
 
module_name = 'math'  # 要加载的模块名
math_module = importlib.import_module(module_name)
sqrt_func = getattr(math_module, 'sqrt')

【3】重新加载模块:

  • 在开发过程中,我们有时需要重新加载一个已经导入的模块,以便应用最新的修改。
  • importlib 模块提供了 reload 函数来实现这个功能。
  • 示例代码如下:
python 复制代码
import importlib
 
module_name = 'my_module'  # 要重新加载的模块名
my_module = importlib.import_module(module_name)
my_module = importlib.reload(my_module)

【4】获取已导入的模块列表:

  • 通过 sys.modules 可以获取当前已导入的所有模块的字典
  • 其中键为模块名称,值为模块对象。
  • 以下示例演示如何遍历已导入的模块列表:
python 复制代码
import sys
 
for module_name, module in sys.modules.items():
    print(module_name, module)

【群发功能演示】

【一】引入

  • 我们在Django的配置文件中,里面的中间件配置文件,虽然使用逗号分开,但是可以做到直接引入某个模块
python 复制代码
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】引入

  • 定义一个包
python 复制代码
def wechat(content):
    print(f"wechat接收到的通知:>>>{content}")


def QQ(content):
    print(f"QQ接收到的通知:>>>{content}")


def email(content):
    print(f"email接收到的通知:>>>{content}")
  • 启动文件中启动包
python 复制代码
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)功能部分
  • 先分别创建不同的消息功能文件
    • 在同一个文件夹下
    • 创建三个功能文件
python 复制代码
class WeChat(object):
    def __init__(self):
        # 发送消息前的准备工作
        # 比如掉接口/初始化配置等
        pass

    def send(self, content):
        print(f"WeChat 发送的消息 :>>>{content}")

class QQ(object):
    def __init__(self):
        # 发送消息前的准备工作
        # 比如掉接口/初始化配置等
        pass

    def send(self, content):
        print(f"QQ 发送的消息 :>>>{content}")

class email(object):
    def __init__(self):
        # 发送消息前的准备工作
        # 比如掉接口/初始化配置等
        pass

    def send(self, content):
        print(f"email 发送的消息 :>>>{content}")
  • 在上面的文件内创建初始化文件
python 复制代码
import settings
import importlib


def 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)调用部分
  • 在外部定义一个配置文件
python 复制代码
MODEL_LIST = [
    'model.email.email',
    'model.QQ.QQ',
    'model.WeChat.WeChat',
]
  • 在外部的真正功能文件
python 复制代码
import model

model.send_all('这是测试消息')
python 复制代码
email 发送的消息 :>>>这是测试消息
QQ 发送的消息 :>>>这是测试消息
WeChat 发送的消息 :>>>这是测试消息
相关推荐
原则猫9 小时前
HOOKS 背后机制
前端
码语智行9 小时前
首页导航跳转功能深度解析-系统内和系统外
前端
阿猫的故乡10 小时前
Vue过渡动画从入门到装X:淡入淡出、滑动、列表动画、第三方库全搞定
前端·javascript·vue.js
IManiy10 小时前
总结之Vibe Coding前端骨架
前端
JS菌10 小时前
AI Agent 沙箱双层防护体系:从权限过滤到内核隔离的完整实现
前端·人工智能·后端
Aphasia31110 小时前
从输入URL到页面展示全流程
前端·面试
我叫黑大帅11 小时前
前端如何竖屏固定视口背景
前端·javascript·面试
abcy07121311 小时前
python pandas csv异步后台清洗前端优先返回成功信息
前端·python·pandas
IT_陈寒11 小时前
Vite这个坑我帮你踩了,动态导入居然这样才生效
前端·人工智能·后端
swipe11 小时前
Mem0 x Agent 实战系列:分层记忆 + 三路召回,搭建真正可用的长期记忆层
前端·javascript·面试