编程故事之python的设计模式

Python中的23种设计模式:详细分类与总结 设计模式是解决特定问题的通用方法,分为创建型模式、结构型模式和行为型模式三大类。本文是对每种模式的详细介绍,包括其核心思想、应用场景和优缺点。 阅读详情

编程故事之python的设计模式

 

在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋友圈以后,发现大家都推荐同一个老师,人称吉先生。

于是他的父母毫不犹豫就交了一笔不菲的学费,每周六日下午让孩子去学习。

少年学习非常刻苦,很快就学会了Python语法、工具和框架。

老师像是见到了可以雕刻的美玉,倾囊相授,告诉他不仅要把代码写对,还要让代码漂亮、优雅、可读、可维护。

少年又学会了单元测试、TDD、重构,努力让自己的代码达到老师所要求的标准。

他还把“Python 之禅”贴在了自己的墙上,经常对照自己的代码,从来都不敢违反。

The Zen of Python, by Tim Peters

Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. ......

三年以后,少年以为自己成为了Python的大师,直到有一天,老师给他布置了一个大作业,其实是个大项目,业务非常复杂。

少年通宵达旦地编程,可他悲惨地发现,无论他怎么努力,他的代码都是乱糟糟的,没有美感,他所写出的类,模块混成了一团。

于是他只好去请教老师: “老师,我的Python和Flask框架已经用得滚瓜烂熟了,为什么完成不了这个项目呢?”

老师说:“孩子,原来你只需要把框架的类给import进来,稍微写点儿代码就行了,现在你需要自己去设计类,自己去做出抽象了!”

“怎么设计呢?”

“为师送你一本古书《设计模式》,你回去好好看看吧。”

少年如获至宝, 废寝忘食地去研究这本20多年前出的、泛黄的古书,还是用C++描述的。

他看得云里雾里,似乎明白,又似乎不明白,只好再去请教老师。

这一次,老师给了他另外一本书《Head First 设计模式》。少年翻开一看,这本书是用Java写的,于是又一头扎到了Java语言当中。

这本书比较通俗易懂,少年看得大呼过瘾。

终于,他信心十足地用Python开始那个大项目了。

他用Python语言实现设计模式,解决一些设计问题,可是总觉得不对劲,和Java 、C++相比,感觉怪怪的。

另外他感觉到了动态语言的不爽之处,每次想重构的时候,总是不敢下手,他把困惑给老师说了。

老师笑道:“我在Java王国的时候,人们总是说‘动态一时爽,重构火葬场’, 现在你体会到了吧!”

“Java就能避免这个问题吗?”

“Java是一门静态语言,变量类型一旦确定就不能改变,对重构的支持非常好,你有没有兴趣去看看?那里有很多的框架,像Spring、Spring Boot、MyBatis、Dubbo、Netty,非常繁荣发达。”

少年心生向往,于是老师就给他写了个条子,告诉他说到了Java王国,找到IO大臣,一切事情都会畅通无阻。

少年辞别老师,奔向了Java帝国,老师整了整衣冠, 望着东方Java帝国的方向,庄严地拜了三拜:“五年了,IO大人,我没有辜负您的重托,又忽悠了一个人去做Java了!”

原来这位老师就是吉森! IO大臣派来传播Java文化和价值观的传教士,入境后不幸被识破,软禁在了Python王国。

Python没有接口?

Python国王收到边关的奏报,说是最近有不少年轻人奔向了Java王国,不知道是不是国内政策有变,导致人心浮动。

Python国王震怒,下令严查。 查来查去,所有的线索都指向了一个人:吉森。

这一天,Python特使带着士兵来到了吉森的住所,果然发现他又在忽悠年轻人了。

特使又气又笑:“你学了半吊子的Python,居然敢来蛊惑人心,实在是可笑。”

吉森看到自己的计谋已被识破,依然很镇静:“大人误会了,我教的就是正宗的面向对象的设计和设计模式啊,这设计模式用Python实现起来很别扭,我就推荐他们去学Java啊。”

“胡说,Python写设计模式怎么会很别扭? Java 由于语法所限,表达能力比较弱,对于一些问题,只好用笨拙的设计模式来解决,我们Python有可能在语法层面就解决问题了!”

“那你说说,设计模式的原则是什么?” 吉森问道。

“1. 面向接口编程,而不是面向实现编程。2. 优先使用组合而不是继承。” 这是难不住特使的。

“Python连接口都没有,怎么面向接口编程?” 吉森问道。

特使哈哈大笑:“说你是半吊子吧,你还不服,你以为这里的接口就是你们Java的interface啊!你忘了Python的Duck Typing了?”

编程故事之python的设计模式

 

)

“看到没有, Duck和Airplane都没有实现你所谓的接口,但是都可以调用fly()方法,这难道不是面向接口编程, 如果你非要类比的话,这个fly就是一个自动化的接口啊。”

吉森确实没想到这一层,至于第二个原则,优先使用组合而不是继承,可以是每个面向对象的语言都可以实现的,他叹了口气,也就不问了。

 

一、Adapter模式

特使接着说:“Duck Typing非常强大,你不是提到了设计模式吗,在Duck Typing面前,很多设计模式纯属多此一举。我来给你举个例子,Adapter模式。假设客户端有这么一段代码,可以把一段日志写入文件当中。”

编程故事之python的设计模式

 

 

“现在来了新的需求,要把日志写入数据库, 而数据库并没有write 方法,怎么办? 那就写个Adapter吧。”

编程故事之python的设计模式

 

 

“注意这个DBAdapter并不需要实现什么接口(我大Python也没有接口),就是一个单独的类,只需要有个write方法就可以了。”

编程故事之python的设计模式

 

 

确实是很简单,只要有write 方法, 不管你是任何对象,都可以进行调用, 典型的Duck Typing 。

既然Adapter可以这么写,那Proxy模式也是类似了,只要你的Proxy类和被代理的类的方法一样,那就可以被客户使用。

但是这种方法的弊端就是,不知道log方法的参数类型,想要重构可就难了。

 

2、单例模式

 

吉森又想到了一个问题,继续挑战特使:“Python连个private 关键字都没有,怎么隐藏一个类的构造函数,怎么去实现单例?”

特使不屑地说:“忘掉你那套Java思维吧,在Python中想写个Singleton有很多办法,我给你展示一个比较Python的方式,用module的方式来实现。”

编程故事之python的设计模式

 

 

使用Singleton:

编程故事之python的设计模式

 

 

吉森确实没有想到这种写法,利用Python的module来实现信息的隐藏。

 

三、Visitor模式

 

不是每个设计模式都能这么干吧? 吉森心中暗想,他脑海中浮现了一个难于理解的模式:Visitor,自己当初为了学习它可是下了苦工。

吉森说:“那你说说,对于Visitor,怎么利用Python的特色?”

“我知道你心里想的是什么,无非就是想让我写一个类,然后在写个Visitor对它进行访问,是不是?”

编程故事之python的设计模式

 

 

吉森说:“是啊, 难道Visitor模式不是这么写的吗? ”

"我就说你的Python只是学了点皮毛吧,Visitor的本质是在分离结构和操作, 在Python中使用generator可以更加优雅地实现。”

编程故事之python的设计模式

 

 

不得不承认,这种方式使用起来更加简洁,同时达到了结构和操作进行分离的目的。

特使说道: “看到了吧,Python在语言层面对一些模式提供了支持,所以很多设计模式在我大Python看起来非常笨拙,我们这里并不提倡,当然我们还是要掌握面向对象设计的原则SOLID和设计模式的思想,发现变化并且封装变化,这样才能写出优雅的程序出来。”

吉森叹了一口气,感慨自己学艺不精,不再反抗,束手就擒。

Python 中最简最好的设计模式 作为这么一门有前途也有钱途的语言,还有什么理由不去学习和掌握呢? 阅读详情

相关推荐

导读:生活中的设计模式——启程之前,请不要错过我

为什么叫设计模式 什么是设计模式 设计模式与生活有什么联系 为什么要学设计模式 如何进行学习 为什么选择 Python 弥补市场空缺 大势所趋,Python 已然成风 简单的 Python 基础 Python 的特点 基本语法 常用容器 List(列表) Tuple(元组) Dictionary(字典) 类的定义 Demo 让你顿悟 重要说明 两年前 优快云...

阳光日志 3437

Python的23种设计模式(完整版带源码实例)

设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验,考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言,它是一种解决问题的思想和方法最后的最后由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

编辑编辑器 2万+

Amesim基础篇-元件详解-流体库管路

Amesim基础篇-元件详解-流体库管路

2201_75375391的博客 4524

python的设计模式

文章目录设计模式0、接口1、单例模式方法一:使用模块方法二、装饰器实现方法三、基于__new__方法2、工厂模式3、建造者模式 设计模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 0、接口 定义:一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这种方法,作用:限制继承接口的类的方法的名称及调用方式,隐藏了类的内部实现 1、单例模式 ​ 单例模式(Singleton Pattern)是一种常用的软

weixin_43673156的博客 8841

WPS专业版自带字体

WPS专业版其中一个好处就是自带了部分有版权的字体,就算你安装了没买授权,他也会给你在系统里面安装上这些字体,至于没授权继续用合不合规我不知道。但是带来的实实在在的好处就是有些子他支持的全啊。 /usr/share/fonts/wps-office/FZWBK.TTF: 方正魏碑_GBK,FZWeiBei\-S03:style=Regular /usr/share/fonts/wps-office/FZFSK.TTF: 方正仿宋_GBK,FZFangSong\-Z02:style=Regular /us

chenqioulin的博客 5710

电力-平衡式IEC 60870-5-101规约报文解析

本文详细介绍了电力自动化中平衡式IEC 60870-5-101规约的应用,包括链路建立与初始化、对时、遥控操作、数据上送和总召唤等关键步骤,通过实例解析了报文格式和交互过程,是理解配网自动化通信的重要参考资料。

让你爱上电路设计 5686

python设计模式总结

介绍 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。—— Christopher Alexander 软件危机催生了设计模式,面向对象,软件工程。是什么每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。热身既然是针对面向对象的,让我们先来回顾一下面向的三大特性和接口面向对象的三大特性:

Ayhan_huang的博客 2207

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 291

python设计模式有哪几种?

Python设计的几种模式

派森的博客 1483

【AI智能体】Dify 搭建个人专属简历美化助手操作详解

Dify 搭建个人专属简历诊断助手实战操作详解

congge 4384

VEML7700环境光传感器原理图设计,已量产(光线传感器)

最近做便携显示设备的自动亮度调节模块,最终敲定了 VEML7700 这款数字光传感器 —— 一是它 0~120klx 的宽量程刚好覆盖 “暗室→户外强光” 的全场景,二是 Filtron™技术让它的光谱响应和人眼高度贴合,测出来的 “亮度” 更符合实际视觉感受,加上 O-Trim™技术把输出公差压到 10% 以内,省了不少后期校准的功夫。搭好电路后串口直接读 lx 数值,稳定性和精度都够,这篇聊聊这个模块的硬件设计细节。

不脱发的程序猿 605

生活中的设计模式——我有故事,你有酒吗?

饭后散步 追影:听风,今天世界杯开赛了,我们去看球吧! 听风:不想去,没心情! 追影:怎么啦? 听风:现在年中调薪,师兄弟们都加薪了,就我没有了! 追影:堂主为啥不给你加啊? 听风:师父说我的功夫还有待提高,说我写的代码毛毛糙糙,不仅Bug多,还不能重用。别人一剑能杀多人,我只能一棍打昏,二棍抡死! 追影:你这么一说,我的心情也不好了!我很多师兄师姐都去鹅厂、猫厂、狗厂、猪厂进修...

阳光日志 3480

基于 ESP32-CAM 与 TinyML 的食堂餐盘自动识别与营养分析终端

【代码】基于 ESP32-CAM 与 TinyML 的食堂餐盘自动识别与营养分析终端。

weixin_42300449的博客 167

为什么Python不用设计模式?

参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 |刘欣责编 | 伍杏玲来源|码农翻身(ID:coderising)在遥远的Python王国,有一位少年...

Python大本营的博客 222

在 SAP 系统中,成本中心(Cost Center)是成本核算与费用管控的基础组织单元,其设计质量直接决定了后续成本归集、分摊、分析及责任考核的准确性

SAP系统成本中心设计核心要点:1. 设计原则包括责任可控、业务同质、核算颗粒度适配、组织对齐及稳定性平衡;2. 划分维度主要有部门、功能、地域、项目和资产5类,可组合使用;3. 需避免颗粒度过细、跨责任主体归集等常见误区;4. 建议采用"明确目标-梳理业务-设计编码"三步法,建立科学的成本中心体系。合理的成本中心设计能精准归集费用、明确责任主体,为成本分析和管控奠定基础。

金牌架构师 1443

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从生活中领悟设计模式(Python)

课程介绍 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、无数工程师实践的代码设计经验的总结,它是面向对象思想的高度提炼和模板化。使用设计模式将会让代码具有更高的可重用性、更好的灵活性和可拓展性、更容易阅读和理解。 程序不应只是冷冰冰的代码,更应赋予它生活的乐趣和特殊的意义。本课程内容将会从生活的角度,在生活的每一个细节和故事中解读一个个设计模式。力求用最通俗的语言阐述最难...

GitChat 8073

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

为什么 Python 不用设计模式?

作者 |刘欣责编 | 伍杏玲本文经授权转自码农翻身(ID:coderising)在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋...

优快云资讯 1648

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

编写高质量代码:改善Python程序代码的91个建议

建议1:理解Pythonic概念 建议2:编写Pythonic代码 建议3:理解Python与C语言的不同之处 建议4:在代码中适当添加注释 建议5:通过适当添加空行使代码布局更为优雅、合理 建议6:编写函数的4个原则 建议7:将常量集中到一个文件 ...

bug中的极品!!!专治BUG 896

python用设计模式吗_为什么Python不用设计模式?

为什么Python不用设计模式?

weixin_39532352的博客 287

用故事学 Python 面向对象编程:从宠物店到代码世界

本文系统讲解Python面向对象编程,从类与对象基础到封装、继承、多态三大特性,深入魔术方法、描述符、元类等高级主题,涵盖工厂模式、观察者模式等设计模式实战,帮助你真正掌握Python OOP。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 891
上一篇: Python接口测试之Requests(七)
下一篇: Python标准库可能准备大清洗了!
程序员林子
博客等级 码龄7年 369粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值