深入浅析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 06 Python
Python 自动化表单提交实例代码
Jun 08 Python
python构建深度神经网络(DNN)
Mar 10 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
python3 读取Excel表格中的数据
Oct 16 Python
python实现在cmd窗口显示彩色文字
Jun 24 Python
python调用支付宝支付接口流程
Aug 15 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
英国日常交易网站:Wowcher
2018/09/04 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
工业学校毕业生自荐书
2014/01/03 职场文书
九年级体育教学反思
2014/01/23 职场文书
法人委托书范本
2014/04/04 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
医生辞职信范文
2015/03/02 职场文书
终止劳动合同通知书
2015/04/16 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技