Python 里没有接口,如何写设计模式?
最近在学设计模式,正在看《大话设计模式》和《深入浅出设计模式》(就是head first那本)
一本用的是C#,一本用JAVA。都有接口。
(当一个类实现接口的时候,必须把接口里面的方法都实现一遍。否则会报错。)
(嗯..我知道C#和Java都不支持多重继承,Python里支持)
我想用Python把这些设计模式实现一遍。
Python里没有接口。如何实现设计模式?用多重继承的方式?
(我不是一定要用interface. 我只是想知道在没有interface语言里要如何解决。)
(问题已经搜索过了 = = 查不到答案才来这儿的,非伸手。。)
回复内容:
不要看java的设计模式教材就觉得搞设计模式就是设计interface。显然完全不是这样的。设计模式搞了那么多东西就是在告诉你如何在各种情况下解耦你的代码,让你的代码在运行时可以互相组合。这就跟兵法一样。难道有了飞机大炮兵法就没有用了吗?
当然了,动态类型语言和函数式语言有自己的模式,他们长得跟四人帮写的东西不太一样,因为有些模式已经化作了语法,而有些语法又化作了模式。搞架构切记生搬硬套,这是没有好结果的。
设计模式就是在给语言打补丁,所以同样的东西在Java、C#和C++下面搞出来都不一样呢。C++有些很好的东西python没有,有些东西C++可以流畅的写python就只能打补丁了,如果遇到这个问题的人非常多,这样就产生了新的针对python的模式了
关于设计模式和接口,楼上各位说了不少了。我就不参合了。也一直是个容易引起口水的话题。 既然楼主想用Python把这些设计模式实现一遍。我就推荐一个很棒的项目给你,已经有人做过这件事了,而且做的很棒 ,你在用python实现这些设计模式卡壳时,可以参考下别人的做法~
python-patterns ---A collection of design patterns/idioms in PythonPython的设计模式问题可以参考
从Python角度重新审视了那二十几种模式, (然而很多用不到, 作者会解释为什么用不到
貌似市面上讲Python设计模式的只此一本. http://pypi.python.org/pypi/zope.interface
另外我没明白,为什么设计模式必须要依赖Interface? 看看peter norvig的文章,Design Patterns in Dynamic Languages,在一个支持first class function的语言里,大部分设计模式都不见了。
java设计模式这么重,很大一部分原因是因为语言的表达能力太弱,设计模式本身不是描述业务逻辑的,把业务逻辑隐藏在一个个模式之下,感觉就像在跟这个语言斗争。
再分享Mark Dominus的一篇文章 The Universe of Discourse : Design patterns of 1972
我觉得写的很好,Java/c++里的很多模式,并不是用来解决特定情境下的recurring problem. 很大一部分模式都是用来弥补语言自己表达能力的不足。 动态类型,first-class function,宏...可以很方便地实现很多模式
Visitor Pattern -> Generic Functions (Multiple Dispatch)
Factory Pattern -> Meta Classes, closures
Singleton Pattern -> Meta Classes
Iterator Pattern -> Anonymous Functions (used with Higher Order Functions)
Mediator, Observer -> Method combination
Facade Pattern -> Modules (Norvig)
...
滥用动态特性、高阶函数、宏...,很容易导致程序难以维护,并可能有效率陷阱。
Java让你更精心地做接口设计,当然也有很多是过度设计,,并且原本是可以不那么“绕”的。。
设计模式是为了更好地做接口设计(类、对象、模块、函数之间的接口),封装变化,方便扩展。
有高级特性的语言,实现起来更直接而已。换个角度来说,也更容易滥用“设计模式”。。 使用zope.interface
<span class="kn">from</span> <span class="nn">zope.interface</span> <span class="kn">import</span> <span class="n">Interface</span><span class="p">,</span> <span class="n">implements</span> <span class="k">class</span> <span class="nc">IMan</span><span class="p">:</span> <span class="k">def</span> <span class="nf">talk</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""comments"""</span> <span class="k">class</span> <span class="nc">Geek</span><span class="p">():</span> <span class="n">implements</span><span class="p">(</span><span class="n">IMan</span><span class="p">)</span> <span class="k">def</span> <span class="nf">talk</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">print</span> <span class="s">"知了知了你别吵, 怪蜀黍正在睡午觉"</span> <span class="ow">or</span> <span class="nd">@implementer</span><span class="p">(</span><span class="n">IMan</span><span class="p">):</span> <span class="k">class</span> <span class="nc">Geek</span><span class="p">():</span> <span class="k">def</span> <span class="nf">talk</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">print</span> <span class="s">"知了知了你别吵, 怪蜀黍正在睡午觉"</span>
实际上软件设计只需要遵循一下原则,就可以设计出非常优雅的结构:
单一职责原则
开放封闭原则
里氏替换原则
依赖倒置原则
接口隔离原则
而所谓的设计模式,其实只是为了在特定语言特性中应用这些原则的产物。知道这个,就不会执着于使用设计模式了 知道Python中接口的表示(实现)的有两种方法吧
1. @范培说的 zope.interface 这个在 twisted用得很多
2. Pyhton中内置的ABC模块。 这里有些文档可以看下http://dev.pocoo.org/~mitsuhiko/PythonBasket.pdf Flash内部用到的
然后这里有个文章比较的 Deciphering Glyph :: Explaining Why Interfaces Are Great 所有的duck typing的编程语言都不需要设计模式。
《设计模式》你看看是有帮助的,
但是想在Python中使用就很没必要。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

无法找到一款将 XML 直接转换为 PDF 的应用程序,因为它们是两种根本不同的格式。XML 用于存储数据,而 PDF 用于显示文档。要完成转换,可以使用编程语言和库,例如 Python 和 ReportLab,来解析 XML 数据并生成 PDF 文档。

手机XML转PDF的速度取决于以下因素:XML结构的复杂性手机硬件配置转换方法(库、算法)代码质量优化手段(选择高效库、优化算法、缓存数据、利用多线程)总体而言,没有绝对的答案,需要根据具体情况进行优化。

没有APP可以将所有XML文件转成PDF,因为XML结构灵活多样。XML转PDF的核心是将数据结构转换为页面布局,需要解析XML并生成PDF。常用的方法包括使用Python库(如ElementTree)解析XML,并利用ReportLab库生成PDF。对于复杂XML,可能需要使用XSLT转换结构。性能优化时,考虑使用多线程或多进程,并选择合适的库。

XML 转换图片需要先确定 XML 数据结构,再选择合适的图形化库(如 Python 的 matplotlib)和方法,根据数据结构选择可视化策略,考虑数据量和图片格式,进行分批处理或使用高效库,最终根据需求保存为 PNG、JPEG 或 SVG 等格式。

不可能直接在手机上用单一应用完成 XML 到 PDF 的转换。需要使用云端服务,通过两步走的方式实现:1. 在云端转换 XML 为 PDF,2. 在手机端访问或下载转换后的 PDF 文件。

想要通过XML生成图片,需要使用图形库(如Pillow、JFreeChart)作为桥梁,根据XML中的元数据(尺寸、颜色)生成图片。控制图片大小的关键在于调整XML中<width>和<height>标签的值。然而,在实际应用中,XML结构的复杂性、图形绘制的精细度、图片生成的速度和内存消耗,以及图片格式的选择,都对生成的图片大小产生影响,因此需要深入理解XML结构、熟练掌握图形库,以及考虑优化算法和图片格式选择等因素。

用大多数文本编辑器即可打开XML文件;若需更直观的树状展示,可使用 XML 编辑器,如 Oxygen XML Editor 或 XMLSpy;在程序中处理 XML 数据则需使用编程语言(如 Python)与 XML 库(如 xml.etree.ElementTree)来解析。

XML 美化本质上是提高其可读性,包括合理的缩进、换行和标签组织。其原理是通过遍历 XML 树,根据层级增加缩进,并处理空标签和包含文本的标签。Python 的 xml.etree.ElementTree 库提供了方便的 pretty_xml() 函数,可以实现上述美化过程。
