Python的插件化开发概述
Python的插件化开发概述
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.插件化开发
动态导入:
运行时,根据用户需求(提供字符串),找到模块的资源动态加载起来。
1>.内建函数“__import__() ”
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie class A:
def showme(self):
print("I am A")
test01.py文件内容
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie if __name__ == '__main__':
mod = __import__("test01") #import语句本质上就是调用这个函数。但是不鼓励直接使用它。建议使用"importlib.import_module()"
cls = getattr(mod,"A")
cls().showme()
2>.mportlib.import_module()
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import importlib def plugin_load(plugin_name:str, sep=":"):
m, _, c = plugin_name.partition(sep)
mod = importlib.import_module(m) #支持绝对导入和相对导入,如果是相对导入,package必须设置。
cls = getattr(mod, c)
return cls() if __name__ == '__main__': #装载插件
a = plugin_load('test01:A')
a.showme()
二.插件化编程技术
1>.依赖的技术
反射:
运行时获取类型的信息,可以动态维护类型数据 动态import:
推荐使用importlib模块,实现动态import模块的能力 多线程:
可以开启一个线程,等待用户输入,从而加载指定名称的模块
2>.加载的时机
模块或插件什么时候加载合适?程序启动的时候,还是程序运行中?
程序启动时:
像pycharm这样的工具,需要很多组件,这些组件也可能是插件,启动的时候扫描固定的目录, 加载插件。
程序运行中:
程序运行过程中,接受用户指令或请求,启动相应的插件
两种方式各有利弊,如果插件过多,会导致程序启动很慢,如果用户需要时再加载,如果插件太大或者依赖多,插件也会启动慢。所以先加载必须的、常用的插件,其他插件使用时,再动态载入。
3>.应用
软件的设计不可能尽善尽美,或者在某些功能上,不可能做的专业,需要专业的客户自己增强。比如Photoshop的滤镜插件。
Notepad++,它只需要做好一个文本编辑器就可以了,其它增强功能都通过插件的方式提供。 如:拼写检查、HTML预览、正则插件等。 要定义规范,定义插件从哪里加载、如何加载、必须实现的功能等。
插件是把模块加载到系统中,运行它,增强当前系统功能,或者提供系统不具备的功能,往往插件技术应用在框架设计中。系统本身设计简单化、轻量级,实现基本功能后,其他功能通过插件加入进来,方便扩展。
Python的插件化开发概述的更多相关文章
- Android组件化和插件化开发
http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...
- Android 使用动态载入框架DL进行插件化开发
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...
- TinyFrame升级之八:实现简易插件化开发
本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...
- Android插件化开发
客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...
- Android插件化开发---执行未安装apk中的Service
欢迎各位增加我的Android开发群[257053751] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...
- NET 平台下的插件化开发内核
.NET 平台下的插件化开发内核(Rabbit Kernel) 每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...
- JavaScript插件化开发
大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ...
- 插件化开发—动态加载技术加载已安装和未安装的apk
首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...
- 【我的Android进阶之旅】Android插件化开发学习资料
1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...
随机推荐
- Operation之其他实用操作符
delay 该操作符会将 Observable 的所有元素都先拖延一段设定好的时间, 然后才将他们发送出来 Observable.of(1,2,3,4) .delay(5, scheduler: Ma ...
- Playbooks简介
Playbooks简介 关于Playbooks Playbook简单示例 基本组成 主机和用户 任务列表 Handlers: 配置更改时运行操作 执行Playbook Ansible-Pull Lin ...
- windows mysql手动添加my.ini 服务启动不了
[mysqld] character-set-server=utf8 #绑定IPv4和3306端口 bind-address=0.0.0.0 port= default_storage_engine= ...
- Linux下安装配置rocketmq
1.安装jdk,如果系统有原来的系统自带的先删掉,因为很多库不全,自己需要到jdk官网下载包. 卸载CentOS自带的OpenJdk: [root@centos-lx /]# rpm -qa | gr ...
- Python删除文件,空文件夹,非空文件夹
首先,在Python中文件路径是这种格式: file_path1 = r'F:\test\1' 删除文件,命令 os.remove(file_path1) 删除空文件夹,命令 os.rmdir(fil ...
- LeetCode 1071. 字符串的最大公因子(Greatest Common Divisor of Strings) 45
1071. 字符串的最大公因子 1071. Greatest Common Divisor of Strings 题目描述 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连 ...
- zuul网关路由作用
为了方便客户端调用微服务,所以设计出了网关.在微服务实例地址发生改变的情况下,客户端调用服务要能够不受影响. 网关可以完成的功能:路由,反向代理,日志记录,权限控制,限流 在本例子中 Eureka ...
- Win10最详细的优化设置 完美解决磁盘100%占用
1.用360优化win10后开不了机的问题原因是禁用了三个服务:在360应用软件服务里dmwappushsvc.diagnsticsTrackingservice.coreMessaging这三个要开 ...
- updatetable 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条造成问题一种原因
数据库 表A ID UserName DeptID DeptName 1 张三 1 技术部 表B ID DeptName 1 市场部 当使 ...
- Java中的常量池(字符串常量池、class常量池和运行时常量池)
转载. https://blog.csdn.net/zm13007310400/article/details/77534349 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的 ...