|
[功能的插拔式设计]
1、在配置文件中注册功能setting.py中NOTIFY_LIST = [
'notify.email.Email',
'notify.qq.QQ',
'notify.wechat.Wechat',
]2、①自己创建一个模组包,在__init__.py文件,写入核心逻辑import settings
import importlibdef send_all(content):
for path_str in settings.NOTIFY_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 notify import email
# 2、利用反射得到属性名
cls=getattr(module,class_name) # 通过email得到Email的属性,所以得到了类名
# 3、生成对象
obj=cls()
# 4、利用鸭子类型调用send方法
obj.send(content)
1、for遍历配置文件的功能、importlib模块
2、字符串的切割解压赋值 module_path,class_name=str_path.rsplit('.',maxsplit=1)
module=importlib.import_module 3、反射 cls= getattr(module,class_name)
5、面向对象、鸭子类型 obj=cls() obj.send(content)
一定要总结吸收该思想
②在这个模组包写入正常的功能,并且里面为类包含函数的形式存在:class Email(object):
def __init__(self):
pass # 发送邮箱你需要准备做的前期工作
def send(self, content):
print('邮箱通知:%s' % content)
3、最后自己创建一个start.py文件把模组包导入进来就可以了import notify
notify.send_all('content')
4、总结:这个思想的好处在于他的扩展性变得更强了,以后想要取消一些功能的时候只需要在settings.py文件中注释某一行就可以了,想要添加的时候只要在settings.py中输入字符串路径,然后在模组包中建一个功能的py文件即可使用,不用改动其他代码
|
|
|