深入浅析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的lambda匿名函数的简单介绍
Apr 25 Python
用Python和MD5实现网站挂马检测程序
Mar 13 Python
python抓取网页时字符集转换问题处理方案分享
Jun 19 Python
Python中的__slots__示例详解
Jul 06 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
python xpath获取页面注释的方法
Jan 14 Python
python序列化与数据持久化实例详解
Dec 20 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
个人写的PHP验证码生成类分享
2014/08/21 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
js中的string.format函数代码
2020/08/11 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
Python中非常实用的一些功能和函数分享
2015/02/14 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
高中生毕业自我鉴定
2013/10/10 职场文书
合同专员岗位职责
2013/12/18 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
神秘岛读书笔记
2015/07/01 职场文书
详解Django的MVT设计模式
2021/04/29 Python