基于django中间件的编程思想

1、importlib模块

解析字符串,并导入改路径的模块

# 根据字符串导入模块
# 通常用来导入包下面的模块
import importlib
res = 'mylife.b'
ret = importlib.import_module(res)

就相当于from mylife import b
该方法最小单位只能到py文件名

# 由字符串找函数、方法、类 利用 反射
the_class = getattr(o, "Person")
p2 = the_class("小黑")
p2.dream()


2、基于中间件思想,使用setting配置文件
    同时给所有人发送通知

    2.1、使用面向对象的方法创建多个py文件
        根据功能不同创建多个py文件,在py文件中创建类
        鸭子类型创建send的方法

       2.2  __init__文件
        使用反射和鸭子类型


3、setting.py文件

4、创建一个启动文件

email.py文件

class Email(object):
    def __init__(self):
        pass

    def send(self,conent):
        print('邮箱通知:%s' %conent)

phone.py文件

class Phone(object):
    def __init__(self):
        pass

    def send(self,conent):
        print('电话通知:%s' %conent)

message.py文件

class Message(object):
    def __init__(self):
        pass

    def send(self,conent):
        print('短信通知:%s' %conent)

init.py文件

import settings
import importlib


def send_all(content):
    for path_str in settings.notice_data:  # 遍历出一个个字符串'mytest.email.Email'
        # 将对象从右边开始切割,只分割一次,module_path=mytest.email,class_name=Email
        module_path, class_name = path_str.rsplit('.', maxsplit=1)
        # importlib.import_module(mytest.email)相当于from mytest import email,得到一个个对象
        module = importlib.import_module(module_path)
        # 使用字符串的反射获取类名
        cls = getattr(module, class_name)
        # 生成类的对象
        obj = cls()
        # 利用鸭子类型直接调用send方法
        obj.send(content)

setting.py文件

notice_data = [
    'mytest.email.Email',
    'mytest.phone.Phone',
    'mytest.message.Message',
]

start.py文件

import mytest
mytest.send_all('快下课了')

 

posted @ 2021-12-08 21:53  一叶松  阅读(29)  评论(0编辑  收藏  举报