Python -- 插件化开发

本文深入探讨了插件化编程技术,包括动态导入模块的方法,如使用__import__()和importlib.import_module(),以及插件化编程的核心理念。文章详细解释了插件化的依赖技术和加载时机,并以Notepad++为例,说明了插件如何增强软件功能。

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

动态导入

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

内建函数__import__()

__import__(name, globals=None, locals=None, fromlist=(), level=0

  • name,模块名
  • import语句本质上就是调用的这个函数,但是不鼓励直接使用它。
  • 建议使用importlib.import_module()

sys = __import__('sys')等价于import sys

# t1.py
class A:
    def showme(self):
        print('I am A')
     
# t2.py
if __name__ == '__main__':
    mod = __import__('t1')
    cls = getattr(mod, 'A')
    cls().showme()

# 执行结果
I am A

importlib.import_module()

  • importlib.import_module(name, package=None)
    支持绝对导入和相对导入,如果是相对带入,package必须设置
# t1.py
class A:
    def showme(self):
        print('I am A')
        
# 主模块程序t2.py
import importlib

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

if __name__ == '__main__':
    # 装载插件
    obj = plugin_load('t1:A')
    obj.showme()

# 执行结果
I am A

上面的例子就是插件化编程的核心代码

插件化变成技术

依赖的技术

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

加载的时机

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

两种方式有利弊,如果插件过多,会导致程序启动很慢,如果用户需要时再加载,插件太大或者依赖多时,插件也会启动慢

  • 所以先加载必须的、常用的插件,其他插件使用时,再动态载入较为好

应用

软件的设计不可能尽善尽美,或者在某些功能上,不可能做的专业,需要专业的客户自己增强。
Noerpad++,它只需要做好一个文本编辑器就可以,其他增强功能都通过插件的方式提供

  • 瓶邪检查、HTML预览、正则插件等
  • 要定义规范,定义插件从哪里加载,如何加载、必须实现的功能等

插件是把模块加载到系统中,运行它,增强当前系统功能,或者提供系统不具备的功能,往往插件技术应用在框架设计中。系统本身设计简单化、轻量级,实现基本功能后,其他功能通过插件加入进来,方便扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值