深入浅析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 相关文章推荐
使用tensorflow实现线性svm
Sep 07 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
Django组件之cookie与session的使用方法
Jan 10 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
Django工程的分层结构详解
Jul 18 Python
wxPython之wx.DC绘制形状
Nov 19 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
django使用JWT保存用户登录信息
Apr 22 Python
浅谈Python中threading join和setDaemon用法及区别说明
May 02 Python
Python基于当前时间批量创建文件
May 07 Python
python如何删除列为空的行
Jul 17 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
Codeigniter的一些优秀特性总结
2015/01/21 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
python 基础教程之Map使用方法
2017/01/17 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python里dict变成list实例方法
2019/06/26 Python
python变量的存储原理详解
2019/07/10 Python
浅析Python的命名空间与作用域
2020/11/25 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
Hibernate持久层技术
2013/12/16 面试题
医学护理毕业生自荐信
2013/11/07 职场文书
消防安全汇报材料
2014/02/08 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python