0
点赞
收藏
分享

微信扫一扫

插件化开发


文章目录

  • ​​插件化开发​​
  • ​​动态导入​​
  • ​​1.内建函数`__import__()`​​
  • ​​2.importlib.import_module()函数​​
  • ​​插件化开发编程技术​​

插件化开发

动态导入

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

1.内建函数​​__import__()​

​__import__(name, globals=None, locals=None, fromlist=(), level=0)​​ #加载指定模块

  • name #str类型,模块名称
  • import 语句本质上就是调用这个函数,但是不鼓励直接使用它。建议使用importlib.import_module()。
  • ​sys = __import__("sys")​​​等价于​​import sys​

简单示例:

# test1.py文件内容
class A:
def showme(self):
print("我是A类中的showme方法")

# 主模块test.py文件内容
import importlib

if __name__ == "__main__":
# mod = __import__("test1")
mod = importlib.import_module("test1")
cls = getattr(mod,"A")
getattr(cls(),"showme")()
a = cls()
a.showme()

插件化开发_加载

2.importlib.import_module()函数

  • importlib.import_module(name,package=None) #支持绝对导入和相对导入,如果是相对导入,package必须设置。

importlib.import_module(".",package=“test1”) #等价于from . import test1

  • 插件化开发,代码核心思路代码

# test1.py
class A:
def showme(self):
print("I am A")

# 主程序模块
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__":
#装载差价
a = plugin_load("test1:A")
a.showme()

插件化开发编程技术

  • 依赖的技术
  1. 反射:运行时获取类型的信息,可以动态维护类型数据
  2. 动态import:推荐使用importlib模块,实现动态import模块的能力
  3. 多线程:可以开启一个线程,等待用户输入,从而加载指定名称的模块
  • 加载的时机
  1. 程序启动时加载:
  • 像pycharm这样的工具,需要很多组件,这些组件也可能是插件,启动的时候扫描固定的目录,加载插件。
  1. 程序运行中加载
  • 程序运行过程中,接受用户指令或请求,启动相应的插件

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

  • 应用
  1. 软件的设计不可能尽善尽美,或者在某些功能上,不可能做的专业,需要专业的客户自己增强。比如Photoshop的 滤镜插件。
  2. Notepad++,它只需要做好一个文本编辑器就可以了,其它增强功能都通过插件的方式提供。
  3. 拼写检查、HTML预览、正则插件等。
  4. 要定义规范,定义插件从哪里加载、如何加载、必须实现的功能等。

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


举报

相关推荐

0 条评论