一、import_module
方法
import_module
方法用来通过形如'aaa.bbb.ccc'
的路径字符串,导入指定的模块:
import importlib
ret = importlib.import_module('myfile.b') # 等价于:from myfile import b
print(ret)
注意:import_module
只能导入到模块层次(即某一py文件),导入模块内成员会报错。
二、插拔式设计原理
django自带的配置文件十分好用,需要的功能在配置文件中注册后即可生效,不需要就注释或删除掉,会立刻失效。而它背后的原理也十分简单,通过import_module
方法就能够很方便的实现:
在模块中,写入类,实现各种功能。
在settings.py
配置文件中,注册这些类:
LIST = [
# 配置项,不需要就注释掉,需要就取消注释
# 也可以自己写入
'notify.email.Email',
'notify.qq.QQ',
'notify.wechat.Wechat',
]
在包的__init__.py
文件中:
import settings
import importlib
def send_all(content):
for path_str in settings.LIST:
# 获取模块路径和类名
module_path, class_name = path_str.rsplit('.',maxsplit=1)
# 模块路径:module_path = 'notify.email';类名:class_name = 'Email'
# 1 利用字符串导入模块
module = importlib.import_module(module_path) # from LIST import email
# 2 利用反射获取类名
cls = getattr(module,class_name) # Email、QQ、Wechat
# 3 生成类的对象
obj = cls()
# 4 利用鸭子类型的特点直接调用对象方法
obj.方法1(参数)
obj.方法2(参数)