基于Django中间件引发的编程思想

基于Django中间件引发的编程思想(重点)

importlib模块使用

能够以字符串的形式导入模块,最小单位只能到模块名

# 1. 创建一个py文件 aaa.py
# 2. 创建一个mypach文件夹,里面创建一个bbb.py文件,写上name='zhao'

然后再aaa.py中书写以下代码
import importlib

res = 'mypack.bbb'  # 最小单位只能到模块的名字,不能点模块里的变量名
ret = importlib.import_module(res)  # from mypack import bbb
print(ret)


# 结果如下
<module 'mypack.bbb' from 'E:\\Python\\python\\python进阶\\WEB开发\\day12\\mypack\\bbb.py'>

编程思想

1. 先创建一个notify文件夹,里面创建py文件,有几个功能,创建几个py文件
2. 因为一个文件夹,里面有一个个的py文件,就是一个包,所以要再notify文件夹里创建__init__.py文件
3. settings #配置文件
4. start.py #启动文件

image-20221111151627195

email.py

class Email(object):
    def __init__(self):
        pass  # 发送邮箱需要做的前期准备工作   接口什么的

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

qq.py

class Qq(object):
    def __init__(self):
        pass  # 发送QQ需要做的前期准备工作

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

wechat.py

class Wechat(object):
    def __init__(self):
        pass  # 发送微信需要做的前期准备工作

    def send(self, content):
        print('微信通知:%s' % content)

settings.py

NOTIFY_LIST = [       
    'notify.email.Email',
    'notify.qq.Qq',
    'notify.wechat.Wechat',
]

__init__.py (编程思想的灵魂)

import settings
import importlib


def send_all(content):
    for path_str in settings.NOTIFY_LIST:  # 'notify.email.Email',
        module_path, class_name = path_str.rsplit('.', maxsplit=1)
        # module_path='notify.email'
        # class_name='Email'
        # 1. 利用字符串导入模块
        module = importlib.import_module(module_path)  # from motify import email
        # 2. 利用反射获取类名
        cls = getattr(module, class_name)  # Email Qq Wechat
        # 3. 生成类的对象
        obj = cls()
        # 4. 利用鸭子类型直接调用send方法
        obj.send(content)

start.py

import notify

notify.send_all('国庆不放假')
posted @ 2022-12-12 16:58  ExpiredSaury  阅读(23)  评论(0编辑  收藏  举报