前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

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

作者头像
用户1214487
发布2018-01-24 14:28:44
7230
发布2018-01-24 14:28:44
举报
文章被收录于专栏:PythonPython

实现抽象类的两种方式

方式一

代码语言:javascript
复制
from abc import ABCMeta
from abc import abstractmethod

class BaseMessage(metaclass=ABCMeta):

    @abstractmethod
    def send(self,subject,body,to,name):
        pass

方式二

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

邮件提醒

代码语言:javascript
复制
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

代码语言:javascript
复制
# ################## 自定义消息提醒的配置 ###################
MESSAGE_CLASSES = [
    'utils.message.email.Email',
    'utils.message.msg.Msg',
    'utils.message.wx.WeChat',
    'utils.message.dingding.DingDing',
]
代码语言:javascript
复制
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方法
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现抽象类的两种方式
    • 方式一
      • 方式二
      • 邮件提醒
      • 动态导入模块+反射
      相关产品与服务
      短信
      腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档