常用模块之importlib模块
956 字
5 分钟
常用模块之importlib模块
【一】介绍
- importlib 模块是 Python 中用于动态加载和导入模块的内置模块。
- 它提供了一组函数和类,使得我们可以在运行时根据需要加载模块,并且可以对已导入的模块进行操作和管理。
【二】动态加载模块
- importlib 模块提供了 import_module 函数
- 通过该函数可以在运行时动态加载一个模块。
import importlib
module_name = 'math' # 要加载的模块名math_module = importlib.import_module(module_name)【三】导入指定模块成员
- importlib 模块还提供了 import_module 函数的变体 import_module
- 它可以直接返回指定模块的成员。
import importlib
module_name = 'math' # 要加载的模块名math_module = importlib.import_module(module_name)sqrt_func = getattr(math_module, 'sqrt')【三】重新加载模块
- 在开发过程中,我们有时需要重新加载一个已经导入的模块,以便应用最新的修改。
- importlib 模块提供了 reload 函数来实现这个功能。:
import importlib
module_name = 'my_module' # 要重新加载的模块名my_module = importlib.import_module(module_name)my_module = importlib.reload(my_module)【四】获取已导入的模块列表
- 通过 sys.modules 可以获取当前已导入的所有模块的字典
- 其中键为模块名称,值为模块对象。
import sys
for module_name, module in sys.modules.items(): print(module_name, module)【五】中间件思想
【1】前言
- 我们在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模块实现
【2】面条版
- 以多平台发送消息为例
- send_message.py
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("这是一条测试信息")- 输出
wechat接收到的通知:>>>这是一条测试信息QQ接收到的通知:>>>这是一条测试信息email接收到的通知:>>>这是一条测试信息【3】模块版
(1)功能部分
- 先分别创建不同的消息功能文件
- 在同一个文件夹下
- 创建三个功能文件
- send_message_package/wx.py
class WeChat(object): def __init__(self): # 发送消息前的准备工作 # 比如掉接口/初始化配置等 pass
def send(self, content): print(f"WeChat 发送的消息 :>>>{content}")- send_message_package/qq.py
class QQ(object): def __init__(self): # 发送消息前的准备工作 # 比如掉接口/初始化配置等 pass
def send(self, content): print(f"QQ 发送的消息 :>>>{content}")- send_message_package/email.py
class Email(object): def __init__(self): # 发送消息前的准备工作 # 比如掉接口/初始化配置等 pass
def send(self, content): print(f"email 发送的消息 :>>>{content}")- send_message_package/init.py
from .email import Emailfrom .qq import QQfrom .wx import WeChat- main.py
from send_message_package import *
def send_message(obj_list, content): for obj in obj_list: obj.send(content)
obj_list = [QQ(), WeChat(), Email()]send_message(obj_list, "这是测试消息")email 发送的消息 :>>>这是测试消息QQ 发送的消息 :>>>这是测试消息WeChat 发送的消息 :>>>这是测试消息(3)调用部分
- 在外部定义一个配置文件
- settings.py
MODEL_LIST = [ 'send_message_package.Email.email', 'send_message_package.QQ.QQ', 'send_message_package.WeChat.WeChat',]- 在外部的真正功能文件
import settingsimport 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')email 发送的消息 :>>>这是测试消息QQ 发送的消息 :>>>这是测试消息WeChat 发送的消息 :>>>这是测试消息【4】小结
- 遵从Python中的鸭子类型
- 可以在功能文件中自定义功能文件添加或者注释
- 在 settings.py 文件中相关的路径注释掉或添加上去即可
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
C 语言发展史
编程语言了解 C 语言从 BCPL、B 语言到现代标准 C 的发展历程、核心特点与应用领域。
2
C 语言开发环境的安装与配置
编程语言在 Windows、Linux 与 macOS 上安装 C 工具链,配置编辑器,并编译运行第一个 C 程序。
3
C 语言初识:程序运行机制与基本结构
编程语言认识 C 程序从源代码到运行的完整流程,以及基础语法和程序的基本结构。
4
C 语言基础:注释、关键字、变量与数据类型
编程语言学习 C 语言的注释、关键字、标识符、常量、变量和基本数据类型等基础知识。
5
C 语言数据类型
编程语言理解 C 语言的数据类型体系,包括基本类型、整数类型、浮点类型和逻辑类型。
随机文章随机推荐














