美文网首页
python settings 中通过字符串导入模块

python settings 中通过字符串导入模块

作者: Dream_RM | 来源:发表于2018-11-24 22:58 被阅读0次

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

相关文章

  • python settings 中通过字符串导入模块

    1. 项目文件结构 2. 接下来看看 文件中的内容 2.1. __init__.py 文件的内容 2.2. no...

  • 模块和包的创建与导入

    一、模块 在python中,模块就是python文件,其后缀为.py。我们通过import语句来导入模块或者导入模...

  • python进阶 第一天 反射

    反射通过字符串的形式导入模块,通过字符串的形式去模块中寻找指定函数,全局变量,并执行根据字符串的形式去某个模块中寻...

  • 包和pygame

    python中的包: 引入包、使用import.模块的方法导入、通过form文件import模块的方式导入、在文件...

  • Python实现类似Java的反射

    反射是通过字符串的形式操作对象的相关成员 反射也就是通过字符串的形式,导入模块,通过字符串的形式去模块中寻找指定函...

  • Python import语句导入模块语法

    Python import语句导入模块语法 源文档Python import语句导入模块语法python中的imp...

  • python08-反射 & 面向对象(一)

    反射 反射:通过字符串的形式导入模块通过字符串的形式去模块中寻找制定的成员(属性、函数),并使用 上面的函数是正常...

  • 包和模块

    一、python中包和模块的区别: 1.包:包含 文件的文件夹,导入模块的可通过 变量。2.模块:编写python...

  • python 批量模块导入(笔记)

    环境:python3.6目的:根据列表['os', 'sys', 're']中的字符串导入对应模块 仅笔记,并知道...

  • Python模块

    模块 在Python中,一个.py文件就称之为一个模块(Module)。 通过import导入模块 访问权限 正常...

网友评论

      本文标题:python settings 中通过字符串导入模块

      本文链接:https://www.haomeiwen.com/subject/qiruqqtx.html