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. 介绍 及 使用途径

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

转载于:https://www.cnblogs.com/dream4567/p/9191173.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提示 CTRL Q: 在参数列表位置,显示可以输入的所有参数。 CTRL Q: 查看选方法的文档字符串 阅读 CTRL -: 折叠当前代码 CTRL +: 展开当前代码 CTRL SHIFT -: 折叠所有代码 CTRL SHIFT +: 展开所有代码 CTRL SHIFT F7:  将当前单词在整个文件高亮,F3移动到下一个,ESC取消高亮。 CTRL F11 | F11: 设置书签. SHIFT F11: 显示所有书签。 CTRL F12: 当一个文件方法太多,要快速跳到某个方法时,可以用此快捷键打开LIST, 除了用上下箭选择外,还可以输入字母。 移动 ALT F7: 查找哪些地方使用了选的方法。 ALT UP: 移到上一个方法 ALT DOWN: 移到下一个方法 CTRL B | CTRL 单击: 转到方法定义处 CTRL SHIFT UP: 将当前行上移一行 CTRL SHIFT UP: 将当前行下移一行 SHIFT ENTER: 在行间执行时,智能跳到下一行。 注释 CTRL /: 注释、取消注释行 选择 ALT 左键: 列模式选择 CTRL W: 选当前单词,继续按,选它所属的行/IF/方法. 编辑 CTRL D: 未选时,复制当前行到下一行,选时复制粘贴选部分。 CTRL J: 输入模板 SHIFT F6: 更改变量/方法名字 删除 CTRY Y: 删除当前行 调试 CTRL F8: 设置/取消断点 其它 CTRL E: 最近访问的文件列表 ESC: 焦点从其它窗口到编辑窗口 SHIFT ESC:  隐藏当前窗口,焦点到编辑窗口 F12: 焦点从编辑窗口到上一个使用窗口 编辑器右键,local history, show history: 显示本地修改记录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值