实现抽象类的两种方式

方式一

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_106_创建类的两种方式

    class Foo(object): def __init__(self, name): self.name = name f = Foo("alex") print(type(f ...

  3. Python 自定义元类的两种写法

    有关元类是什么大家自己搜索了解,我这里写一下实现元类的两种写法 # 自定义元类 #继承type class LowercaseMeta(type): ''' 修改类的属性名称为小写的元类 ''' # ...

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

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

  5. Python 防止mysql 注入的两种方式

    Python防止sql注入一般有两种方法 1.escape_string   MySQLdb.escape_string(param) 注意:如果报错出现 'ascii' codec can't en ...

  6. python安装第三方包的两种方式

    最近研究QQ空间.微博的(爬虫)模拟登录,发现都涉及RSA算法.于是需要下一个RSA包(第三方包).折腾了很久,主要是感觉网上很多文章对具体要在哪里操作写得不清楚.这里做个总结,以免自己哪天又忘了. ...

  7. xml转json和实体类的两种方式

    本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: ...

  8. python数字转换为字符串的两种方式

    主要包括两种形式进行转换: 第一种是str(),将值转换为用户便于阅读的形式: 另一种是repr(),将值转换为合法的python表达式. >>> print repr(" ...

  9. 实现mapper接口注入的两种方式,以及后台的使用区别

    1.使用模板方式: <!--使用模板类实现mybatis --> <bean id="sqlSession" class="org.mybatis.sp ...

随机推荐

  1. 应用教程之帕克西AR虚拟试妆3D动态美妆

    帕克西技术团队通过对美妆行业深度调研,凭借自主研发的人脸识别与面部追踪等技术,打造的超现实AR虚拟试妆应用已成功上线,内置万千妆容,包含口红.眉毛.睫毛等,一点即可试妆,就像照镜子一样简单. 那么,帕 ...

  2. mysqldump指定编码导出数据

    mysqldump指定编码导出数据 第一步,导出旧库 mysqldump --default-character-set=latin1 -uroot -pXXX --database db >  ...

  3. Android数据绑定技术一,企业级开发

    PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...

  4. poj 2905 双向队列(待补充)

    Parallel Computer Simulator   Description Programs executed concurrently on a uniprocessor system ap ...

  5. idea快速搭建springboot项目

    Spring Boot是由Pivotal团队提供的全新框架,设计目的是用来简化新Spring应用的初始搭建以及开发过程.它主要推崇的是'消灭配置',实现零配置. 那么,如何在idea中创建一个spri ...

  6. DNS解析全过程

    浏览器输入一个网址.要訪问该网址必须由DNS解析出相应的server的IP地址. 对于大型站点来说,一个站点相应多台server.那么DNS解析出的可能是进行负载均衡的server的IP地址.DNS解 ...

  7. .Net 5分钟搞定网页实时监控

    一.为什么会用到网页实时监控 LZ最近在无锡买房了,虽然在上海工作,但是上海房价实在太高无法承受,所以选择还可以接受的无锡作为安身之地.买过房的小伙伴可能知道买房的流程,买房中间有一步很重要的就是需要 ...

  8. JAVA入门[14]-Spring MVC AOP

    一.基本概念 1.AOP简介 DI能够让相互协作的软件组件保持松散耦合:而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组 ...

  9. MongoDB 数据库备份与恢复

    1.MongoDB数据库备份     1.语法:         mongodump -h dbhost -d dbname -o dbdirectory         参数说明:         ...

  10. 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

    优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以看出一个人的技术积累.那么,关于系统优化,假设这么个场景,用户反映系统太卡(其实就是高并发),那么我们怎么优化? 如果请求过多, ...