Python 插件化开发

本文介绍了Python的动态导入技术,包括内建函数`__import__()`和`importlib.import_module()`,强调了`importlib`的使用。接着讨论了插件化编程,依赖反射和动态import,探讨了加载时机,如程序启动时和运行中,并举例说明。最后,阐述了插件化的应用场景,如软件扩展和定制,以提高系统的灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态导入

运行时, 根据用户需求(提供字符串), 找到模块的资源动态加载起来

1. 内建函数 __import__()

__import__(name, globals=None, locals=None, fromlist=(), level=0)
  • name 指代 模块名
  • import 语句本质上就是调用这个函数, 不鼓励直接使用它, 建议使用importlib.import_module()
  • __import__(‘sys’) 等价于 import sys

2. importlib.import_module()

importlib.import_module(name, package=None)
  • 支持绝对导入和相对导入, 如果是相对导入, package 必须设置
# t8.py
class A:
    def showme(self):
        print('test')


# 主程序模块 t10.py
import importlib

def plugin(plugin_name:str, sep=':'):
    m, _, c = plugin_name.partition(sep)
    mod = importlib.import_module(m)
    cls = getattr(mod, c)
    return cls()

if __name__ == '__main__':
    a = plugin('t8:A')
    a.showme()
  • 上面的例子就是插件化编程的核心代码

插件化编程技术

1. 依赖的技术

  • 反射 : 运行时获取类型信息, 可以动态维护类型数据
  • 动态import : 推荐使用importlib 模块, 实现动态import 模块的能力
  • 多线程 : 可以开启一个线程, 等待用户输入, 从而加载指定模块

2. 加载的时机

什么时候加载合适呢 ?
程序启动的时候, 还是程序运行中呢 ?

  • 程序启动时
    像pycharm 这样的工具需要很多组件, 这些组件也可以能是插件, 启动时扫描固定的目录, 加载插件
  • 程序运行中
    程序运行过程中, 接收用户指令或请求, 启动相应的插件

两种方式各有利弊, 如果插件过多, 会导致程序启动很慢, 如果用户需要时再加载, 插件太大或者依赖太多, 插件启动也会很慢
所以先加载必须的, 常用的插件, 其他插件使用时再动态载入

3.应用

  • 软件的设计不可能尽善尽美, 或者在某些功能上不够专业, 需要专业的客户自己增强, 比如Photoshop 的滤镜插件
  • Notepad ++ , 他只需要做好一个文本编辑器即可, 其他增强功能都可以通过插件化的方式提供
  • 定义规范, 定义插件从哪里加载, 如何加载, 必须实现的功能等
  • 插件是把模块加载到系统中运行它, 增强当前系统功能, 或者提供系统不具备的功能, 旺旺插件化技术应用在框架爱设计中, 系统本身设计简单化, 轻量级, 实现基本功能后, 其他功能通过插件加入进来i,方便扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值