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 列表中的类会在调用模块时直接执行

python settings 中通过字符串导入模块的更多相关文章

  1. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...

  2. python根据字符串导入模块

    问题: path = "auth.my_auth.AUTH" # 根据path实例化AUTH类 解决: path = "auth.my_auth.AUTH" i ...

  3. importlib 根据字符串导入模块

    应用: Django中间件,rest framework 组件的全局配置文件 import importlib path = "abc.def.foo" module_path,c ...

  4. python创建__init.py__文件导入模块仍然报错ModuleNotFoundError: No module named 'name'

    今自定义模块后非相同目录导出提示找不到模块报错信息如下: ModuleNotFoundError: No module named 'name' 各方查找各位大神方法很多 参考链接 1.在需要导入的文 ...

  5. import xxx和from xxx import xx中修改被导入模块里面的变量的坑

    现在有如下几个模块: A.py 功能:定义全局变量,供其他模块使用 name = "张三" lists = [1, 2, 3, 4, 5] B.py 功能:打印A.py中的变量 f ...

  6. Python数据类型中的字符串类型

    1.换行字符:\n print ('I love python.\nAnd you?') 2.转义字符(\):\\ print ('\\\n\\') 3.制表字符(对齐表格的各列):\t print ...

  7. c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)

    引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...

  8. python中导入模块的注意点

    1.import  和 from  import 的区别 import module导入模块:语句执行完后会创建一个新的命名空间,在该命名空间中执行相应的函数.执行时,需要的变量.函数和类名前需要加  ...

  9. Python中好用的模块们

    目录 Python中好用的模块们 datetime模块 subprocess模块 matplotlib折线图 importlib模块 Python中好用的模块们 datetime模块 ​ 相信我们都使 ...

随机推荐

  1. 字典|字典和数组嵌套|keys()|value()|item()|del

    python 中没有i++! dic = { 'a':5, 'kelv':'ooo', 5:2333, 2333:'yoo' } print dic[dic[dic['a']]] print dic ...

  2. 用bosybox制作文件系统

    在orangepi_sdk/source/busybox-1.25.0目录里有源码. ). 先清除编译出来的文件及配置文件 make distclean ). 配置busybox make menuc ...

  3. python之接口开发

    一.接口开发的思路 1.启动一个服务: 2.接受客户端传过来的数据: 3.登录,注册,支付等功能 4.操作数据库,拿到数据: 5.返回数据: import flask server=flask.Fla ...

  4. iOS性能检测工具instrunments简单介绍

    1.前提条件 在appstore中下载安装xcode 2.打开方式 3.页面元素介绍 3.电脑连接手机选中要测试的app 4.选中要测试哪项,双击进去,点击开始进行监控测试 5.主要介绍一下三项 第一 ...

  5. 使用VSCode调试Javascript的三种方式

    Code Runner 在应用商店中搜索Code Runner插件进行安装. 选中你要执行的Javascript脚本,右键选择Run Code,利用Console.log在下方的输出窗口里可以看到输出 ...

  6. VisionPro和Halcon的详细对比

    一.概括的对比 1.1  Halcon的优势 Halcon有着更加低廉的Lisence 1.并且提供更好.更强大的2D和3D的视觉软件库 2.Halcon支持的视觉图像采集设备数量是Visionpro ...

  7. 最大流/最小割模板(isap) POJ1273

    isap模板核心代码: //d[]为距离标号数组,d[i]表示节点i到汇点的距离 //gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数 int dfs(int k,int flow ...

  8. AD复制问题汇总

    1:文件复制服务NtFrs 13568报错的解决方法 解决方法: 建议不要按照日志的提示进行操作,正确的操作应该是 出现这个问题的原因,是由于在硬件的损坏,导致服务器未正确处理NTFS USN 日志. ...

  9. sqlserver 把两个sql查询语句查询出来的两张表合并成一张表

    第一个sql语句 select companyname gsmc,zb zhibiao from t_gsndzb left join t_companycode on t_gsndzb.gsbh=t ...

  10. libphp5.so可能遇到的问题(转摘)

    libphp5.so可能遇到的问题(转摘) 安装完APACHE和PHP5后,经常在启动APACHE载入libphp5.so时发现问题.我把遇到的问题统计下来: 1.undefined symbol:S ...