深入浅析python3 依赖倒置原则(示例代码)


Posted in Python onJuly 09, 2021

场景

针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台

数据的录入无外乎就是对数据的增删改查

下面上一个常规的写法(未符合依赖倒置),整合来自 长安和丰田 的停车数据

class Changan(object):
    def __init__(self):
        self.type = 'changan'

    def ca_add(self):
        print('%s 新增' % self.type)

    def ca_del(self):
        print('%s 删除' % self.type)

    def ca_modify(self):
        print('%s 修改' % self.type)
        
    def ca_get(self):
        print('%s 查询' % self.type)


class Toyota(object):
    def __init__(self):
        self.type = 'fengtian'

    def tyt_add(self):
        print('%s 新增' % self.type)

    def tyt_del(self):
        print('%s 删除' % self.type)

    def tyt_modify(self):
        print('%s 修改' % self.type)

    def tyt_get(self):
        print('%s 查询' % self.type)

class Data(object):

    def __init__(self, car):
        self.car = car

    def data_add(self):
        if self.car.type == 'changan':
            self.car.ca_add()
        else:
            self.car.tyt_add()

    def data_del(self):
        if self.car.type == 'changan':
            self.car.ca_del()
        else:
            self.car.tyt_del()

    def data_mofify(self):
        if self.car.type == 'changan':
            self.car.ca_modify()
        else:
            self.car.tyt_modify()

    def data_get(self):
        if self.car.type == 'changan':
            self.car.ca_get()
        else:
            self.car.tyt_get()

if __name__ == '__main__':
    ca = Changan()
    tyt = Toyota()
    autosystem = Data(ca)
    autosystem.data_add()
    autosystem.data_del()
    autosystem.data_modify()
    autosystem.data_get()
    autosystem.car = tyt
    print('*' * 50)
    autosystem.data_add()
    autosystem.data_del()
    autosystem.data_modify()
    autosystem.data_get()

运行的结果如下

changan 新增
changan 删除
changan 修改
changan 查询
**************************************************
fengtian 新增
fengtian 删除
fengtian 修改
fengtian 查询

可以看到最后的Data类是一个简单工厂,通过面向流程的方式对数据进行增删改查,上层的Data类永远都要依赖下层的Changan类和Toyota类,假设未来Changan类和Toyota类因为需求变更导致实现方式变了,那么Data类也会跟着改,或者未来又来一家新的厂商铃木Suzuki,那么在Data又要多写很多if else。这样的改动对于程序员来说是致命的,每一次变动需要改动的地方都很多,问题油然而生。

如何解决

遵循依赖倒置原则,根据

"程序要依赖于抽象接口,不要依赖于具体实现。"

通过changan、toyota这些类的公共性,把处理数据的方法通过接口抽象出来

import abc

class DataProcessing(metaclass=abc.ABCMeta):
    """
    抽象类
    抽象新增改查
    """
    @abc.abstractmethod
    def data_add(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def data_del(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def data_modify(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def data_get(self, *args, **kwargs):
        pass

class Changan(DataProcessing):
    def __init__(self):
        self.type = 'changan'

    def data_add(self):
        print('%s 新增' % self.type)

    def data_del(self):
        print('%s 删除' % self.type)

    def data_modify(self):
        print('%s 修改' % self.type)
        
    def data_get(self):
        print('%s 查询' % self.type)

class Toyota(DataProcessing):
    def __init__(self):
        self.type = 'fengtian'

    def data_add(self):
        print('%s 新增' % self.type)

    def data_del(self):
        print('%s 删除' % self.type)

    def data_modify(self):
        print('%s 修改' % self.type)

    def data_get(self):
        print('%s 查询' % self.type)

class Data(object):

    def __init__(self, car):
        self.car = car

    def data_add(self):
        self.car.data_add()

    def data_del(self):
        self.car.data_del()

    def data_modify(self):
        self.car.data_modify()

    def data_get(self):
        self.car.data_get()

if __name__ == '__main__':
    ca = Changan()
    tyt = Toyota()
    autosystem = Data(ca)
    autosystem.data_add()
    autosystem.data_del()
    autosystem.data_modify()
    autosystem.data_get()
    autosystem.car = tyt
    print('*' * 50)
    autosystem.data_add()
    autosystem.data_del()
    autosystem.data_modify()
    autosystem.data_get()

运行后结果依然为

changan 新增
changan 删除
changan 修改
changan 查询
**************************************************
fengtian 新增
fengtian 删除
fengtian 修改
fengtian 查询

以上可看出,增删改查已经抽象成DataProcessing里面的方法,以后不管Changan类和Toyota类怎么变动,或者需要新增一个Suzuki类什么的,上层的Data类都不用改变,if name == 'main' 后客户端的调用也不需要怎么改动,代码层次也更清晰,便于后续的扩展。

到此这篇关于python3 依赖倒置原则示例的文章就介绍到这了,更多相关python依赖倒置原则内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
利用python写个下载teahour音频的小脚本
May 08 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
解析Python3中的Import
Oct 13 Python
python字符串的拼接方法总结
Nov 18 Python
python 导入数据及作图的实现
Dec 03 Python
Python with语句和过程抽取思想
Dec 23 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
JavaScript arguments 多参传值函数
2010/10/24 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
解决vue scoped scss 无效的问题
2020/09/04 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
大学生最常用的自我评价
2013/12/07 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
正规欠条模板
2015/07/03 职场文书
教师病假条范文
2015/08/17 职场文书
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技