视频加载失败

常用模块之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 Email
from .qq import QQ
from .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 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')
email 发送的消息 :>>>这是测试消息
QQ 发送的消息 :>>>这是测试消息
WeChat 发送的消息 :>>>这是测试消息

【4】小结#

  • 遵从Python中的鸭子类型
    • 可以在功能文件中自定义功能文件添加或者注释
  • 在 settings.py 文件中相关的路径注释掉或添加上去即可

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录