一、动态导入:编程
运行时,根据用户需求(提供字符串),找到模块的资源动态加载起来。多线程
二、内建函数__import__()框架
def __import__(name, globals=None, locals=None, fromlist=(), level=0):
name:模块名函数
import语句本质上就是调用这个函数,可是不鼓励直接使用它,建议使用importlib.import_module()。工具
sys = __import__('sys')等价于import sys测试
测试 直接调用:spa
测试 能够动态交互加载模块: 插件
1 if __name__ == '__main__': 2 name = input('>>>') 3 mod = __import__(name) # import tt 4 cls = getattr(mod, 'A') 5 cls().showme()
二、importlib.import_module() 线程
1 import importlib 2 importlib.import_module(name, package=None)
支持绝对导入 和 相对导入,若是是相对导入,package必须设置。设计
测试:插件化编程的核心代码。
相对导入:
三、插件化编程技术:
依赖的技术:
反射:运行时获取类型的信息,能够动态维护类型数据。
动态import:推荐使用importlib 模块,实现动态import模块的能力。
多线程:能够开启一个线程,等待用户输入,从而加载指定名称的模块。
加载的时机:
一、程序启动时:
像pycharm 这样的工具,须要不少组建,这些组件也多是插件,启动的时候,扫描固定的目录,加载插件
二、程序运行中:
程序运行过程当中,接受用户指令或请求,启动相应的插件。
两种当时各有利弊,若是插件过多,或致使程序启动很慢,若是用户须要时加载,若是产检太大或者依赖多,插件也会启动慢
因此先加载必须的,经常使用的插件,其余插件使用时,在动态载入。
四、应用:
软件的设计不可能完美,或者在某些功能上,不可能作的专业,须要专业的客户加强。如PS
五、接口和插件的区别:
接口每每是暴露出来的功能,例如模块提供的函数或方法,加载模块后嗲用这些函数完成功能,
接口也是一种规范,它约定了必须是此案的功能(必须提供某名称的函数), 可是不关心怎么实现这个功能。
插件是把模块加载到系统中,运行它,加强当前系统功能,或者提供系统不具有的功能,每每插件技术应用在框架设计中,系统自己设计简单化,轻量级,实现基本功能后,其余功能经过插件加入进来,方便扩展。