python settings模块导入不了_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 列表中的类会在调用模块时直接执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值