配置文件插拔式设计:

项目配置文件插拔式设计:
    基于django settings源码实现自己项目配置文件插拔式设计

基于django 中间件的思想 实现功能的配置使用:
        --在setting文件可控制多功能的执行!!!

简单版:

#简单版:
#notify.py
def send_email(content):
    print('邮箱通知:%s'%content)


def send_msg(content):
    print('短信通知:%s'%content)


def send_wechat(content):
    print('微信通知:%s'%content)

#start.py
from XX.notify import *

def send_all(content):
    send_msg(content)
    send_email(content)
    send_wechat(content)

if __name__ == '__main__':
    send_all('再坚持一天就周末了')

复杂版

#复杂版:

#start.py  (执行函数)

from notify import *
if __name__ == '__main__':
    send_all('好嗨哦')


#settings.py  (设置函数)

NOTIFY_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.wechat.WeChat',
    'notify.qq.Qq',
]


# notify__init__.py
import settings
import importlib

def send_all(content):
    for path in settings.NOTIFY_LIST:  # "notify.email.Email"
        module_path, cls_name = path.rsplit('.',maxsplit=1)  # (rsplit从又开始切割,以'.'切割一次)
        md = importlib.import_module(module_path)  # 获取文件内所有的方法
        cls = getattr(md,cls_name)  # 获取到文件中类的名字
        obj = cls()  # 实力化产生一个个类的对象
        obj.send(content)


#notify.email.Email.py
class Email(object):
    def __init__(self):
        pass  # 发送邮件需要的前期准备

    def send(self,content):
        print('邮件通知:%s'%content)

#lib.aaa.py

import importlib
res = 'lib.bbb'
# 利用字符串的形式导入模块
md = importlib.import_module(res)  #  ===  from lib import bbb
print(md)

# 注意 : 该模块字符串最小单位只能到文件名

#lin.bbb.py
name = 'from bbb'   # 可修改的功能

importlib 与`__import__的区别:

import importlib / __import__ :
   -->功能 : 通过字符串来导入另一个模块

用法:
    1.导入importlib,调用import_module()方法,传入用户想要获取的模块对应的路径字符串,即可获取一个,模块module,module可以调用这个test模块下的所有属性和方法。

eg: import importlib
 mName = 'lib.test'  # 文件的路径
module = importlib.import_module(mName) #  获取对应模块
module.getname()  # 调用test文件内的属性,方法


用法:
        2.__import__是python的一个内置方法,直接调用     __import__()即可获取一个模块.

    mName = "lib.test"

    module = __import__(mName,fromlist = ('test',))
    module.getName() 
12-25 08:01