深入浅析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通过装饰器检查函数参数数据类型的方法
Mar 13 Python
Python中用sleep()方法操作时间的教程
May 22 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
基于python实现音乐播放器代码实例
Jul 01 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
Python datetime 如何处理时区信息
Sep 02 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
推荐文章系统(一)
2006/10/09 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
jQuery的框架介绍
2016/05/11 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
Python 忽略warning的输出方法
2018/10/18 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python配置文件处理的方法教程
2019/08/29 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
国家励志奖学金获奖感言
2014/01/09 职场文书
学校门卫岗位职责
2014/03/16 职场文书
广告语设计及教案
2014/03/21 职场文书
出国英文推荐信
2014/05/10 职场文书
应届生求职信范文
2014/05/26 职场文书
研究生导师推荐信
2014/09/06 职场文书
个人授权委托书
2014/09/15 职场文书
个人收入证明范本
2014/09/18 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
语文教师个人工作总结
2015/02/06 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
建议书的格式及范文
2015/09/14 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript