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. 【转】Linux虚拟终端命令Screen用法详解

    转自 http://www.linuxidc.com/Linux/2013-07/87415.htm 在使用ssh或者telnet登录远程主机后,执行一些耗时的命令,如果此时ssh或者telnet中断 ...

  2. i2c驱动dht12的原理和步骤

    一.步骤 1.首先匹配i2c的控制器设备和控制器驱动,会生成一个struct i2c_adapter对象, 2.根据i2c_board_info   ,在  arch/arm/mach-sunxi/s ...

  3. Forest Program(2019ccpc秦皇岛F)

    题:http://acm.hdu.edu.cn/showproblem.php?pid=6736 题意:删掉一些边使得图不存在点双,求方案数. 分析:若一条边不属于点双,那么这条边有删和不删俩种选择, ...

  4. RHEL7在线安装rvm(ruby管理包)

    ttp://blog.csdn.net/lixwjava/article/details/50408070 安装curl sudo yum install curl 然后在在终端中输入命令 curl  ...

  5. 关于k8s资源类型和缩写

    资源类型 缩写 描述 clusters     componentstatuses cs   configmaps cm   daemonsets ds   deployments deploy   ...

  6. JavaScript中遍历数组,最好不要用for...in

    先看一段代码 var arr = [2,3,4,5]; for(var i = 0; i < arr.length; i++){ console.log(i,"类型:"+ty ...

  7. java连接access的用户名、密码异常Decoding not supported解决

    Java通过ucanaccess对Access数据库.accdb文件连接: public static Connection getConn() { try { String dbURL = &quo ...

  8. linux新装系统优化

    1:关掉不需要的服务 检查在3级别上哪些是自动启动的 chkconfig --list  |grep ‘3:on’

  9. 乐观锁(Optimistic Lock)

    乐观锁(非阻塞)指不通过锁表来解决并发问题,一般情况下表数据都会加入一个version字段,对该字段进行比较更新来保证数据的一致性. 这里写了个demo,应该可以说明乐观锁的问题. public cl ...

  10. [LC] 74. Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...