1. 项目文件结构

set_test
├─ main.py # 入口函数

├─notify # 自定义的模块
│ ├─ email.py # 自定义模块
│ ├─ msg.py # 自定义模块
│ ├─ wechat.py # 自定义模块
│ └─ __init__.py # 模块导入初始化函数

└─set_test # 总配置文件
└─ settings.py # 这个项目的架构是很多开源项目的架构标准

2. 接下来看看 文件中的内容

2.1. __init__.py 文件的内容

from set_test import settings  # 导入配置文件
import importlib
# 指定路径, 找到指定文件, 并导入
# 作用与 import 模块名 相同 def send_init(context):
for path in settings.NOTTFY_LIST:
# 1. 将路径与类分开, 如
# 'notify.email.Email' 分成了 ['notify.email', 'Email']
# module_path : 模块路径名
# class_name : 模块中的类名
module_path, class_name = path.rsplit('.', 1) # 2. 利用 importlib 导致指定路径的模块文件
modle = importlib.import_module(module_path) # 导入 module_path 路径的文件
cls = getattr(modle, class_name) # 从 modle 模块中 找到 class_name 指定的类
# 所以此时 cls 就是 settings 中要执行的类了 # 3. 执行获取到的类
# a = cls()
# a.send(context) # 调用统一接口 send
# print(a) if __name__ == '__main__':
send_init("send 调用")

2.2. notify 模块下的文件

2). wechat.py

#!/usr/bin/env python3

class WeChat(object):
def __init__(self):
pass def send(self, content):
"""
固定格式, 每个添加的模块都写名字相同的方法, 方便统一调用, send 就是类的统一接口
:param content:
:return:
"""
print("WeChat")

3). email.py

#!/usr/bin/env python3

class Email(object):
def __init__(self):
pass def send(self, content):
"""
固定格式, 每个添加的模块都写名字相同的方法, 方便统一调用, send 就是类的统一接口
:param content:
:return:
"""
print("Email")

msg.py 文件 与 email.py 只有文件名与类型不同,其他相同

3. 总结

3.1. 步骤

1). 将代码写在 __init__.py 中, 如果写在其他路径下的话, 一定要保证路径正确, 否则找不到模块
2). 导入 settings 中指定指定函数的列表, from set_test.settings import NOTTFY_LIST
3). 循环列表, 获取每一个元素对其进行操作
4). 将元素 切分成 路径、类名两部分,
5). 使用 modle = importlib.import_module(路径) 函数, 导入指定的文件
6). 使用 getattr(modle, 类名) 找到 文件中的指定类, 返回值就是所需要的类了

3.2. 介绍 及 使用途径

  1. 这样写是为了 开放封闭原则,使用避免取消或者添加功能时,需要改代码的问题
  2. 使用途径是在用户要执行多个模块功能时使用,写进 settings 文件的 NOTTFY_LIST 列表中的类会在调用模块时直接执行

最新文章

  1. python3 连接SQLserver
  2. 【NOIP2012】借教室
  3. IE11之F12 Developer Tools--控制台工具(Console)
  4. .NET MVC控制器向视图传递数据的四种方式
  5. twitter storm源码走读之1 -- nimbus启动场景分析
  6. String字符串包含运算符实现运算
  7. 静态与动态IP设置
  8. html 作业1
  9. codeforces 546E. Soldier and Traveling 网络流
  10. The certificate used to sign "" has either expired or has been revoked.
  11. Android开发的过去、现在和将来
  12. SAS随机抽样以及程序初始环境
  13. Go语言学习笔记(六) [包]
  14. python 列表 list的基本操作
  15. WPF触发器(Trigger) - DataTrigger
  16. C语言注意点汇总
  17. 阿里云ECS提示RHSA-2017:3263: curl security update
  18. MHL相关资源链接
  19. sublime设置tab键为4个空格
  20. Vuex 状态管理模式

热门文章

  1. Java之代码块
  2. Angular(一)
  3. VerificationCodeService
  4. 扩增|feather evolution
  5. EncryptUtils
  6. OpenCV、EmguCV函数注解
  7. django框架进阶-admin-长期维护
  8. crm项目-权限组件
  9. deeplearning.ai 神经网络和深度学习 week4 深层神经网络
  10. 第一课 安装wamp环境