python settings 中通过字符串导入模块
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. 介绍 及 使用途径
- 这样写是为了
开放封闭原则,使用避免取消或者添加功能时,需要改代码的问题 - 使用途径是在用户要执行多个模块功能时使用,写进 settings 文件的 NOTTFY_LIST 列表中的类会在调用模块时直接执行
python settings 中通过字符串导入模块的更多相关文章
- python中根据字符串导入模块module
python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...
- python根据字符串导入模块
问题: path = "auth.my_auth.AUTH" # 根据path实例化AUTH类 解决: path = "auth.my_auth.AUTH" i ...
- importlib 根据字符串导入模块
应用: Django中间件,rest framework 组件的全局配置文件 import importlib path = "abc.def.foo" module_path,c ...
- python创建__init.py__文件导入模块仍然报错ModuleNotFoundError: No module named 'name'
今自定义模块后非相同目录导出提示找不到模块报错信息如下: ModuleNotFoundError: No module named 'name' 各方查找各位大神方法很多 参考链接 1.在需要导入的文 ...
- import xxx和from xxx import xx中修改被导入模块里面的变量的坑
现在有如下几个模块: A.py 功能:定义全局变量,供其他模块使用 name = "张三" lists = [1, 2, 3, 4, 5] B.py 功能:打印A.py中的变量 f ...
- Python数据类型中的字符串类型
1.换行字符:\n print ('I love python.\nAnd you?') 2.转义字符(\):\\ print ('\\\n\\') 3.制表字符(对齐表格的各列):\t print ...
- c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)
引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...
- python中导入模块的注意点
1.import 和 from import 的区别 import module导入模块:语句执行完后会创建一个新的命名空间,在该命名空间中执行相应的函数.执行时,需要的变量.函数和类名前需要加 ...
- Python中好用的模块们
目录 Python中好用的模块们 datetime模块 subprocess模块 matplotlib折线图 importlib模块 Python中好用的模块们 datetime模块 相信我们都使 ...
随机推荐
- 阿里OSS下载文件,提示The request signature we calculated does not match the signature you provided. Check your key and signing method
提示说是签名不对,但没搞懂签名具体是啥,以为之前做过,有正确的,就一点点比对,最后发现竟然是下载的文件路径,里面必须是/,而不能是\或\\,搞得我哭笑不得.比如,要下载的文件路径是:soft/cszt ...
- Table布局的优缺点
总结 Table布局的缺点是比其它html标记占更多的字节,会阻挡浏览器渲染引擎的渲染顺序,会影响其内部的某些布局属性的生效,优点就是用table做表格是完全正确的 Tables的缺点 1.Table ...
- Android 自定义dialog类
首先定制style样式 styles.xml 加入自定义样式 <style name="CustomLoadingDialog"> <item name=&quo ...
- [LC] 93. Restore IP Addresses
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- ASP.NET防止连续多次点击提交按钮 导致页面重复提交
PS:实际使用中发现,第①种方法在火狐浏览中有时候有问题.第2种方法,在各个浏览器中都没问题 近做项目遇到了这样的情况: 公司网络比平常慢了不少,在点击保存按钮提交页面后需等待挺长的一段时间,忍不住手 ...
- 创想变现:斯坦福设计创新课堂ME310分享(下篇)
编者按:今年6月,微软亚洲研究院人机交互组研究员顾嘉唯,在美国斯坦福大学担任了D-School的ME310设计课程的项目评审.该课程是斯坦福大学的全球联合新产品设计创新课程,学习方式以小组为单位,每个 ...
- 网站爬取-案例一:猫眼电影TOP100
今天有小朋友说想看一下猫眼TOP100的爬取数据,要TOP100的名单,让我给发过去,其实很简单,先来看下目标网站: 建议大家都用谷歌浏览器: 这是我们要抓取的内容,100个数据,很少 我们看一下页面 ...
- 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”
为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统 ...
- nginx负载均衡如何实现
什么是nginx?Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的Web和反向代理服务器,也是一个 IMAP/POP3/SMTP ...
- mysql配置白名单
1. 测试是否允许远程连接 $ telnet 192.168.1.8 3306 host 192.168.1.4 is not allowed to connect to this mysql ser ...