一:先上目录结构

二:各个文件的代码

  1. # -*- coding: utf-8 -*-
  2. # @Author : Felix Wang
  3. # @time : 2018/7/4 16:42
  4.  
  5. from utils.message import send_msgs
  6.  
  7. send_msgs('')

app.py

  1. # -*- coding: utf-8 -*-
  2. # @Author : Felix Wang
  3. # @time : 2018/7/4 16:42
  4.  
  5. MSG_LIST={
  6. # 可以添加或注释
  7. 'utils.message.email.Email',
  8. 'utils.message.msg.Msg',
  9. }

settings

  1. # -*- coding: utf-8 -*-
  2. # @Author : Felix Wang
  3. # @time : 2018/7/4 16:42
  4.  
  5. import settings
  6. import importlib
  7.  
  8. def send_msgs(msg):
  9. for path in settings.MSG_LIST:
  10. m,c=path.rsplit('.',maxsplit=1)
  11. md=importlib.import_module(m)
  12. obj=getattr(md,c)()
  13. obj.send(msg)

__init__.py

  1. # -*- coding: utf-8 -*-
  2. # @Author : Felix Wang
  3. # @time : 2018/7/4 17:05
  4. # 相当于java中的接口
  5.  
  6. class Base(object):
  7. def send(self, msg):
  8. raise NotImplementedError('没有实现send方法')

base.py

  1. # -*- coding: utf-8 -*-
  2. # @Author : Felix Wang
  3. # @time : 2018/7/4 16:51
  4. from .base import Base
  5. class Email(Base):
  6. '''
  7. 发送邮件相关
  8. '''
  9. def __init__(self):
  10. '''
  11. 邮箱相关数据初始化
  12. '''
  13. self.username='aaa'
  14. self.pwd='bbb'
  15. def send(self,msg):
  16. print('Email',msg)
  17. pass

email.py

  1. # -*- coding: utf-8 -*-
  2. # @Author : Felix Wang
  3. # @time : 2018/7/4 16:53
  4. from .base import Base
  5.  
  6. class Msg(Base):
  7. '''
  8. 发送短信相关
  9. '''
  10.  
  11. def __init__(self):
  12. '''
  13. 短信相关数据初始化
  14. '''
  15. self.phonenum = ''
  16.  
  17. def send(self, msg):
  18. print('Msg',msg)
  19. pass

msg.py

  1. 这种方式代码和代码之间的耦合性很低,可扩展性很强,可以用在数据库操作上
    操作的时候只要修改settings文件就行了
    如果要扩展其他发送信息的方法只要按照格式在message目录下新建一个类,实现方法,然后添加到settings
    如果不用某种方法只要在settings中注释掉
    这种方式在scrapy框架中用的非常多。

扩展性很强的python实现方式的更多相关文章

  1. MySQL - 扩展性 1 概述:人多未必力量大

    我们应该接触过或者听说过数据库的性能瓶颈问题.对于一个单机应用而言,提升数据库性能的最快路径就是氪金 - 买更高性能的数据库服务器,只要钱到位,性能不是问题. 但是当系统性能增加到一定地步时,你会发现 ...

  2. TCP接入层的负载均衡、高可用、扩展性架构

    一.web-server的负载均衡 互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡.整个架构分三层: 上游调用层,一般是browser或者APP 中间反向代理层,n ...

  3. python基础----封装、封装与扩展性

    从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数 ...

  4. 【Java/Android性能优 4】PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强

    本文转自:http://www.trinea.cn/android/preloaddatacache/ 本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能.Android图片内存缓存可见I ...

  5. Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...

  6. 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...

  7. python之封装与扩展性

    1.封装与扩展性 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名,参数不变,使用者的代码永远无需改变.这就提供了一 ...

  8. Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

    Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结 1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 ...

  9. 面向对象 - 1.封装之如何实现属性的隐藏/2.封装的意义/3.封装与扩展性/4.property的使用

    1.封装之如何实现属性的隐藏封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Attr ...

随机推荐

  1. 终身机器学习(Lifelong Machine Learning)综述

    终身机器学习(Lifelong Machine Learning)综述 2015年10月23日 17:34:57 qrlhl 阅读数 7805更多 分类专栏: 机器学习   版权声明:本文为博主原创文 ...

  2. mysql+canal+kafka+elasticsearch构建数据查询平台

    1. 实验环境 CPU:4 内存:8G ip:192.168.0.187 开启iptables防火墙 关闭selinux java >=1.5 使用yum方式安装的java,提前配置好JAVA_ ...

  3. 面试常考的js题目(三)

    1.查找两个节点的最近的一个共同父节点,可以包括节点自身 function commonParentNode(oNode1, oNode2) { if(oNode1.contains(oNode2)) ...

  4. flume收集日志直接sink到oracle数据库

    因为项目需求,需要保存项目日志.项目的并发量不大,所以这里直接通过flume保存到oracle 源码地址:https://github.com/jaxlove/fks/tree/master/src/ ...

  5. SpringBoot整合Mybatis关于分页查询的方法

    最近公司在用到SpringBoot整合Mybatis时当web端页面数据增多时需要使用分页查询以方便来展示数据.本人对分页查询进行了一些步骤的总结,希望能够帮助到有需要的博友.如有更好的方式,也希望评 ...

  6. linux系统编程相关

    基本的概念:程序,进程,并发,单道程序设计,多道程序设计,时钟中断. 存储介质:寄存器(操作系统的位数是针对寄存器而言的,32位识字节,64位就是8字节).缓存cache.内存,硬盘,网络. cpu的 ...

  7. Java8 常用Function、Predicate、Consumer、Supplier接口

    1.常用函数是接口: (1)Function<T, R> => R apply(T t) ———— 接受一个T类型的参数,返回R类型结果. Function<Integer, ...

  8. Vue中的key到底有什么用?

    key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确.更快速 diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行 ...

  9. Django基础第三篇

    一.ORM操作 1.常用字段和参数 Autofied 自增的整形字段,必填参数primary_key=True,  则成为数据库的主键,如无该字段,django自动创建 IntegerField 一个 ...

  10. SmartBinding与kbmMW#2

    前言 在之前的文章中,我介绍了SmartBinding作为Delphi的一个新的易于使用和智能的绑定框架.介绍了包括绑定对象,列表,常规数据和可视控件,以及如何使用导航器,所有这些都用代码做了演示. ...