概述
动态导入
运行时, 根据用户需求(提供字符串), 找到模块的资源动态加载起来
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,方便扩展
最后
以上就是顺利冰棍为你收集整理的Python 插件化开发的全部内容,希望文章能够帮你解决Python 插件化开发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复