- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章深入浅析python3 依赖倒置原则(示例代码)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台 。
数据的录入无外乎就是对数据的增删改查 。
下面上一个常规的写法(未符合依赖倒置),整合来自 长安和丰田 的停车数据 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
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这些类的公共性,把处理数据的方法通过接口抽象出来 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
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依赖倒置原则内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/semishigure/p/14989089.html 。
最后此篇关于深入浅析python3 依赖倒置原则(示例代码)的文章就讲到这里了,如果你想了解更多关于深入浅析python3 依赖倒置原则(示例代码)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
GitOps描述了一种使用植根于 Git 版本控制系统的方法来操作和管理软件的方法。使用基于 GitOps 的工作流,通过要求将系统的特征定义为 Git 存储库中的文件,可以更轻松地开发、部署、维护和
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
命令行货币转换器应用程序,提示用户输入源货币、源货币代码和目标货币代码,例如 C:\workspace> java CurrencyConverter 100.50 EUR GBP 应用程序返回源金额
得到这个实体: /** * @ORM\Table(name="shop_payment_details") * @ORM\Entity(repositoryClass="Acme\ShopBund
我有一个原则实体,无需调用 persist 或 flush 即可持久保存到数据库中。 我在下面很简单地重现了这个问题。正如您将看到的,此脚本从名为 MyEntity 的数据库表中加载一行,并获取一个以
在我的编程实践中,我经常遇到客户端和服务器端脚本之间数据重复的问题。 在这种情况下,我们可以讨论客户端的 JavaScript 和服务器端的 PHP 或 C# (ASP.NET)。 比方说,我有一段
简介 我在写关于继承问题的硕士论文并解决了一些问题 表明存在继承问题的指标。 像下面的例子: 示例 public static String getAnimalNoise(Animal animal)
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
当我注意到this answer时,我一直在阅读里氏替换原理。 。它有一个 Circle 和一个 ColoredCircle 类型,其中 ColoredCircle 的构造函数需要一个额外的参数; 颜
这段代码是否违反了DRY原则? if (notAuthorized) { return sendErrorCode(new ForbiddenException()) } else if (n
我在查询中使用 Doctrine 2 的结果缓存来检索用户(消息传递应用程序)的新消息数量: $query->useResultCache(true, 500, 'messaging.nb_new_m
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
如何设置包含类名的变量,例如 android.util.Log 中的 TAG,同时尊重 Dont-Repeat-Yourself? 以下是一些可能性: 在 Google 代码中,它的常用用法如下 pu
我有以下查询: $roles = array(); $roles[] = 'ROLE_SUPER_ADMIN'; $roles[] = 'ROLE_ADMIN';
下面的代码违反了哪一条 SOLID 原则? public class A { void hello(){ //some code here } } public class B ext
我目前有一个 Message_Repository 类,它有如下方法: getLocationDetailsByID($messageId), getCustomerDetailsById($mess
我不知道它到底叫什么,但现在我将它称为“非空测试”。在 C# 8 中有一个新的行为允许测试一个对象是否不为空,例如: Foo foo = new Foo(); if(foo is { }) {
我正在学习 Doctrine。我在多对多关系中有两个实体 Article 和 Category,我正在尝试获取所有不是特定文章的类别。 文章实体: class Article extends Base
在阅读了一本书和一篇在线文章中有关 SOLID 代码的内容后,我想重构一个现有的类,使其与“SOLID”兼容。 但我想我迷路了,尤其是依赖注入(inject):当我想实例化类的一个对象时,我需要“注入
我的项目中有类似的东西,这个项目已经完成了(它正在运行)我只想知道 SOLID 原则是否可以接受 static public class Tools { static public GetPr
我是一名优秀的程序员,十分优秀!