深入浅析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实现的扫雷游戏实例代码
Aug 01 Python
python文件操作相关知识点总结整理
Feb 22 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
Python元字符的用法实例解析
Jan 17 Python
Python断言assert的用法代码解析
Feb 03 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
python实现决策树分类(2)
Aug 30 Python
python 解压pkl文件的方法
Oct 25 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
python os模块常用的29种方法使用详解
Jun 02 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
javascript 面向对象继承
2009/11/26 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
python scatter函数用法实例详解
2020/02/11 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
Python中常见的数制转换有哪些
2020/05/27 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
高校毕业生登记表自我鉴定
2013/11/03 职场文书
信用卡工作证明模板
2014/09/14 职场文书
外国人来华邀请函
2015/01/31 职场文书
综合测评个人总结
2015/03/03 职场文书
行政答辩状范文
2015/05/21 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL