【模块补充】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 发送的消息 :>>>这是测试消息
相关推荐
崔庆才丨静觅10 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅1 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅2 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊2 小时前
jwt介绍
前端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax