深入浅析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字典,函数,全局变量代码解析
Dec 18 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
mac下如何将python2.7改为python3
Jul 13 Python
python安装pil库方法及代码
Jun 25 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
python处理写入数据代码讲解
Oct 22 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
PHP 9 大缓存技术总结
2015/09/17 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
基于php实现的验证码小程序
2016/12/13 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
python对数组进行反转的方法
2015/05/20 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python制作词云的方法
2018/01/03 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
python的继承知识点总结
2018/12/10 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
《宿建德江》教学反思
2014/04/23 职场文书
2014年党务公开方案
2014/05/08 职场文书
党员教师一句话承诺
2014/05/30 职场文书
委托书的格式
2014/08/01 职场文书
假释思想汇报范文
2014/10/11 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
宪法宣传标语100条
2019/10/15 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android