这里我们用到一个非常重要的模块,importlib,利用它可以实现字符串转python代码,再利用反射进行操作,这样就可以实现插拔式设计。
一、我们先做个初级的,把所有文件放到初级思想文件夹下:
1.我们先创建notify.py文件,内部不代码如下:
def send_email(content): print('邮箱通知:%s' % content) def send_msg(content): print('短息通知:%s' % content) def send_wechat(content): print('微信通知:%s' % content)
2.我们创建一个执行文件star.py文件
from 初级思想.notify import *#导入我们在notify文件的函数 def send_all(content):#利用一个函数传参调用其他函数 send_email(content) send_msg(content) send_wechat(content) if __name__ == '__main__': send_all('元旦放三天假')
二、在原有的基础上我们利用中间件的思想来把上面的优化下:
1.创建一个python文件夹
(1).notify
__init__.py
import importlib def send_all(content): # 循环setting配置文件中的NOTFY_LIST,取出对应的值进行下面的操作 for path in setting.NOTIFY_LIST: module_path, cls_name = path.rsplit('.', maxsplit=1) # 按最右边·分割,最大分个数为1个 md = importlib.import_module(module_path) # r如同from notify import email.... cls = getattr(md, cls_name) # 利用不同的前缀(如同from notify import email)反射获取文件中类的名字 obj = cls() # 实例化产生一个个类对象 obj.send(content)
email.py
lass Email(object): def __init__(self): pass #这里可以做一些发送邮件需要的前期准备!!! def send(self,content): print('邮件通知:%s'%content)
wechat.py
class WeChat(object): def __init__(self): pass #发送微信需要做的前期准备 def send(self,content): print('微信通知:%s'%content)
msg.py
class Msg(object): def __init__(self): pass#这里可以放发短信件需要的前期准备 def send(self,content): print('短信通知:%s'%content)
(2).setting.py(配置文件)
NOTIFY_LIST = [ 'notify.email.Email', 'notify.msg.Msg', 'notify.wechat.WeChat', ] #这样就可以实现如同Django中间一样,我们注销哪个哪个就被执行了
(3).start.py(执行文件)
from notify import * if __name__ == '__main__': send_all('好嗨哦')