深入浅析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列表list数组array用法实例解析
Oct 28 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
详解python中的index函数用法
Aug 06 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
PHP中for循环语句的几种变型
2006/11/26 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python针对excel的操作技巧
2018/03/13 Python
python生成ppt的方法
2018/06/07 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python 实现dict转json并保存文件
2019/12/05 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
python实现简单遗传算法
2020/09/18 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
劳动模范事迹材料
2014/01/19 职场文书
服务承诺书怎么写
2014/05/24 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
Python包argparse模块常用方法
2021/06/04 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
使用python绘制横竖条形图
2022/04/21 Python