深入浅析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 相关文章推荐
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
Python实现识别图片内容的方法分析
Jul 11 Python
Django框架模板的使用方法示例
May 25 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
Python PO设计模式的具体使用
Aug 16 Python
Python如何优雅获取本机IP方法
Nov 10 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
python连接mongodb数据库操作数据示例
Nov 30 Python
django使用多个数据库的方法实例
Mar 04 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python中使用HTMLParser解析html实例
2015/02/08 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
小学防溺水制度
2014/01/29 职场文书
校长创先争优承诺书
2014/08/30 职场文书
教师工作失职检讨书
2014/09/18 职场文书
2014年药房工作总结
2014/11/22 职场文书
单位介绍信格式
2015/01/31 职场文书
2015年科协工作总结
2015/05/19 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android