深入浅析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编写Linux系统守护进程实例
Feb 03 Python
详解Python中的join()函数的用法
Apr 07 Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
Python迭代器定义与简单用法分析
Apr 30 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
Python语法分析之字符串格式化
Jun 13 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
正确的理解和使用Django信号(Signals)
Apr 14 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
js prototype截取字符串函数
2010/04/01 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
Python3爬楼梯算法示例
2019/03/04 Python
Python常用特殊方法实例总结
2019/03/22 Python
python向图片里添加文字
2019/11/26 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
sort命令的作用和用法
2012/11/04 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
房地产出纳岗位职责
2013/12/01 职场文书
网络专业学生个人的自我评价
2013/12/16 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
综合素质自我评价评语
2015/03/06 职场文书
Python基本的内置数据类型及使用方法
2022/04/13 Python