实现抽象类的两种方式

方式一

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方法

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

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

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  2. Python 发送 email 的两种方式

    Python发送email的两种方式,分别为使用登录邮件服务器.调用sendmail命令来发送三种方法 Python发送email比较简单,可以通过登录邮件服务来发送,linux下也可以使用调用sen ...

  3. day2 编程语言介绍、Python运行程序的两种方式、变量

    一 编程语言介绍 1. 机器语言 用计算机能理解的二进制指令直接编写程序,直接控制硬件 2. 汇编语言 用英文标签取代二进制指令编写程序,本质也是直接控制硬件 3. 高级语言 用人能理解的表达方式去编 ...

  4. Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...

  5. Python 输出百分比的两种方式

    Python 输出百分比的两种方式 注: 在python3环境下测试. 方式1:直接使用参数格式化:{:.2%} {:.2%}: 显示小数点后2位 显示小数点后2位: >>> pri ...

  6. 【Python】Python figure显示的两种方式

    1. 两种方式: 终端输出图像新窗口输出图像 2. 终端输出命令: %matplotlib inline 新窗口输出命令: %matplotlib qt5 注意此两个语句是命令行输入,若在spyder ...

  7. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  8. python 字符编码的两种方式写法:# coding=utf-8和# -*- coding:utf-8 -*-

    python运行文件是总会出现乱码问题,为了解决这个问题,在文件开头加上: # coding=utf-8 或者 # -*- coding:utf-8  -*- # coding=<encodin ...

  9. python 配置文件返回的两种方式,写法不一样而已

    配置文件如下: [MODE]mode:{ "register":"all"} 或者 mode = {"register":"all ...

随机推荐

  1. android用jsonReader来解析json

    对于这个json: { "id" : "3232", "data" : [{ "data1" : "555&q ...

  2. RESTful概念理解

    基础 REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态. 如果考虑使用它的 Web 服务的数 ...

  3. iOS: 如何获取ios设备的当前IP地址

    有的时候,我们项目上线后,需要根据ip地址去统计不同地区的用户情况,此时IP地址的收取显得尤其重要,一般情况下,在用户登录时去获取用户的ip是准确的,当然实时追踪ip的变化而统计是更安全可靠的. ip ...

  4. 主题 Theme 小结

    主题的使用 默认创建的Android工程中,在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme&qu ...

  5. Java Web学习总结-文件下载

    参考资料:https://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件 ...

  6. (C++)函数参数传递中的一级指针和二级指针

    主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针: ...

  7. python 利用 setup.py 手动安装第三方类库

    python 利用 setup.py 手动安装第三方类库 由于我在mac使用时,装了python3,默认有python2的环境,使用 pip 安装第三方类库时,老是安装到 python2的环境上: 在 ...

  8. uitabbar 标题设置 button text attributes only respected for UIControlStateNormal

    uitabbar 标题设置 button text attributes only respected for UIControlStateNormal [[UITabBarItem appearan ...

  9. es5 - array - join

    /** * join描述:将数组(或类数组对象)的所有元素连接到一个字符串中并返回此字符串. * join语法:arr .join([ separator]) * join参数:指定用于分隔数组的每对 ...

  10. tomcat支持中文文件名下载

    http://blog.csdn.net/wnczwl369/article/details/7483806 Tomcat 是Java开发者使用得较多的一个Web服务器,因为它占用资源小,运行速度快等 ...