深入浅析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实现apahce网站日志分析示例
Apr 02 Python
记录Django开发心得
Jul 16 Python
在Python中使用SimpleParse模块进行解析的教程
Apr 11 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
Python3离线安装Requests模块问题
Oct 13 Python
Python 如何创建一个线程池
Jul 28 Python
通俗讲解python 装饰器
Sep 07 Python
Python中Selenium对Cookie的操作方法
Python常用配置文件ini、json、yaml读写总结
图文详解matlab原始处理图像几何变换
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
You might like
提问的智慧(2)
2006/10/09 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
python目录与文件名操作例子
2016/08/28 Python
深入浅析Python中的yield关键字
2018/01/24 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
python支付宝支付示例详解
2019/08/22 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
品恩科技软件测试面试题
2014/10/26 面试题
中级会计职业生涯规划范文
2014/01/16 职场文书
网络编辑岗位职责
2014/03/18 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
节约用水的口号
2014/06/20 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
如何用python绘制雷达图
2021/04/24 Python
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS