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 列表中的类会在调用模块时直接执行

猜你喜欢

转载自www.cnblogs.com/dream4567/p/9191173.html