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模块 相信我们都使 ...
随机推荐
- Opencv笔记(十二)——形态学转换
学习目标: 学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 我们要学习的函数有: cv2.erode(), cv2.dilate(), cv2.morphologyEx()等 原理简介: 形态 ...
- Sqlite教程(1) SQLiteOpenHelper
首先,创建DbHelper对象,继承SQLiteOpenHelper. Configuration是自行创建的工具类,里面都是App的一些环境设置. public class DbHelper ext ...
- Dcoker 部署Tomcat+redis+war
1.首先安装redis docker run –name my-redis -d redis 2.安装tomcat并启动 docker run -p 8383:8383 –name tomcat -v ...
- ionic 创建服务命令
创建Util工具库 ionic g provider Util
- VBA/VB6/VBS/VB.NET/C#/Python/PowerShell都能调用的API封装库
API函数很强大,但是声明的时候比较繁琐. 我开发的封装库,包括窗口.键盘.鼠标.消息等常用功能.用户不需要添加API函数的声明,就可以用到API的功能. 在VBA.VB6的引用对话框中引用API.t ...
- COMET探索系列二【Ajax轮询复用模型】
写在前面:Ajax轮询相信大家都信手拈来在用,可是有这么一个问题,如果一个网站中同时有好多个地方需要用到这种轮询呢?就拿我们网站来说,有一个未读消息数提醒.还有一个时实时加载最新说说.昨天又加了一个全 ...
- [LC] 144. Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...
- mongo rename collection
db.getCollection('a').renameCollection("b"); db.getCollection('a').find({}, {_id: 0}).forE ...
- django操作非ORM创建的表
问题:django的ORM怎么连接已存在的表,然后进行增删查改操作? 工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢? 下面介绍 ...
- Logarithmic transformation|Data transfer|MASS|Box-Cox
数据转换(Data transfer) 方差分析的前提是方差齐性,可以使用transfer改变方差使得方差变齐.不正态和outlier. Logarithmic transformation使方差聚合 ...