Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

实现抽象类的两种方式

方式一

复制代码
from abc import ABCMeta
from abc import abstractmethod
 
class BaseMessage(metaclass=ABCMeta):
 
    @abstractmethod
    def send(self,subject,body,to,name):
        pass

方式二

复制代码
class BaseMessage(object):
    def send(self, subject, body, to, name):
        raise NotImplementedError('未实现send方法')

邮件提醒

复制代码
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from .base import BaseMessage
 
class Email(BaseMessage):
    def __init__(self):
        self.email = "寄件人的邮箱地址"
        self.user = "寄件人姓名"
        self.pwd = '邮箱密码或SMTP授权码'
 
    def send(self,subject,body,to,name):
        '''
        :param subject: 主题
        :param body: 内容
        :param to:接受者
        :param name:接受者姓名
        :return:
        '''
 
        msg = MIMEText(body, 'plain', 'utf-8')  # 发送内容
        msg['From'] = formataddr([self.user,self.email])  # 发件人
        msg['To'] = formataddr([name, to])  # 收件人
        msg['Subject'] = subject # 主题
 
        server = smtplib.SMTP("smtp.126.com", 25) # SMTP服务
        server.login(self.email, self.pwd) # 邮箱用户名和密码
        server.sendmail(self.email, [to, ], msg.as_string()) # 发送者和接收者
        server.quit()

动态导入模块+反射

settings

复制代码
# ################## 自定义消息提醒的配置 ###################
MESSAGE_CLASSES = [
    'utils.message.email.Email',
    'utils.message.msg.Msg',
    'utils.message.wx.WeChat',
    'utils.message.dingding.DingDing',
]

import importlib
from django.conf import settings
def send_message(to,name,subject,body):
    """
    短信、邮件、微信
    :param to: 接受者
    :param name: 接受者姓名
    :param subject: 主题
    :param body: 内容
    :return:
    """
    for cls_path in settings.MESSAGE_CLASSES:
        # cls_path是字符串
        module_path,class_name = cls_path.rsplit('.',maxsplit=1)  # 得到模块名的地址和模块里的一个类名(都是字符串)
        m = importlib.import_module(module_path)  # 导入模块
        obj = getattr(m,class_name)()·# 通过反射,得到字符串class_name对应的类,并实例化
        obj.send(subject,body,to,name,)  # 执行对应的send方法
相关推荐
m0_734571765 分钟前
深入理解C++ 析构函数<四>虚析构函数
开发语言·c++
芒鸽9 分钟前
把 Agent 运行时做成插件系统:agent-harness(openJiuwen Rust版) 的实践
开发语言·后端·rust
Brilliantwxx11 分钟前
【STM32】 I2C 外设内部硬件结构和状态位
开发语言·stm32·单片机·嵌入式硬件
小七在进步15 分钟前
类和对象(二)
java·开发语言
CHHH_HHH17 分钟前
【Linux系统篇】进程间通信揭秘:从管道到共享内存
linux·服务器·c语言·开发语言·后端·ubuntu
热爱编程的小李18 分钟前
安卫士设备数实时监测警报脚本
python
程序员清风21 分钟前
Python 操作 MySQL、Redis 与消息队列的完整实践
redis·python·mysql
写后端的胖头鱼24 分钟前
【高频面试题】面试题里常出现的Bitmap是什么(附源码和多种场景)
java·开发语言·面试·位图·bitmap
学习智者26 分钟前
《玄》IDE v3.8.2重磅发布:数据外置+全链路优化
开发语言·c++·ide·中文语言 玄
Q26433650233 小时前
【有源码】基于 Hadoop 生态的化妆品销售数据存储分析与可视化 面向化妆品行业的用户画像构建与销售机会识别研究
大数据·hadoop·python·机器学习·spark·毕业设计·课程设计