zoukankan      html  css  js  c++  java
  • 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 列表中的类会在调用模块时直接执行
  • 相关阅读:
    pipeline+sonar
    ThinkPHP 3.2.3 使用 PHPExcel 处理 Excel 表格
    mac下finder子目录直接打开终端
    golang之交叉编译设置
    cocos2dx 3.0 编译工程
    2dx 3.0环境配置(mac)
    golang调用动态库
    qt下用启动图
    qt在动态库里面加载widget的例子
    qt笔记
  • 原文地址:https://www.cnblogs.com/dream4567/p/9191173.html
Copyright © 2011-2022 走看看