搜索
首页后端开发Python教程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 Python
Python的设计模式问题可以参考这本书.
从Python角度重新审视了那二十几种模式, (然而很多用不到, 作者会解释为什么用不到
貌似市面上讲Python设计模式的只此一本. pypi.python.org/pypi/zo

另外我没明白,为什么设计模式必须要依赖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模块。 这里有些文档可以看下dev.pocoo.org/~mitsuhik Flash内部用到的
然后这里有个文章比较的 Deciphering Glyph :: Explaining Why Interfaces Are Great 所有的duck typing的编程语言都不需要设计模式。

《设计模式》你看看是有帮助的,
但是想在Python中使用就很没必要。
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在Python阵列上可以执行哪些常见操作?在Python阵列上可以执行哪些常见操作?Apr 26, 2025 am 12:22 AM

Pythonarrayssupportvariousoperations:1)Slicingextractssubsets,2)Appending/Extendingaddselements,3)Insertingplaceselementsatspecificpositions,4)Removingdeleteselements,5)Sorting/Reversingchangesorder,and6)Listcomprehensionscreatenewlistsbasedonexistin

在哪些类型的应用程序中,Numpy数组常用?在哪些类型的应用程序中,Numpy数组常用?Apr 26, 2025 am 12:13 AM

NumPyarraysareessentialforapplicationsrequiringefficientnumericalcomputationsanddatamanipulation.Theyarecrucialindatascience,machinelearning,physics,engineering,andfinanceduetotheirabilitytohandlelarge-scaledataefficiently.Forexample,infinancialanaly

您什么时候选择在Python中的列表上使用数组?您什么时候选择在Python中的列表上使用数组?Apr 26, 2025 am 12:12 AM

useanArray.ArarayoveralistinpythonwhendeAlingwithHomeSdata,performance-Caliticalcode,orinterFacingWithCcccode.1)同质性data:arrayssavememorywithtypedelements.2)绩效code-performance-clitionalcode-clitadialcode-critical-clitical-clitical-clitical-clitaine code:araysofferferbetterperperperformenterperformanceformanceformancefornalumericalicalialical.3)

所有列表操作是否由数组支持,反之亦然?为什么或为什么不呢?所有列表操作是否由数组支持,反之亦然?为什么或为什么不呢?Apr 26, 2025 am 12:05 AM

不,notalllistoperationsareSupportedByArrays,andviceversa.1)arraysdonotsupportdynamicoperationslikeappendorinsertwithoutresizing,wheremactssperformance.2)listssdonotguaranteeconeeconeconstanttanttanttanttanttanttanttanttimecomplecomecomecomplecomecomecomecomecomecomplecomectaccesslikearrikearraysodo。

您如何在python列表中访问元素?您如何在python列表中访问元素?Apr 26, 2025 am 12:03 AM

toAccesselementsInapythonlist,useIndIndexing,负索引,切片,口头化。1)indexingStartSat0.2)否定indexingAccessesessessessesfomtheend.3)slicingextractsportions.4)iterationerationUsistorationUsisturessoreTionsforloopsoreNumeratorseforeporloopsorenumerate.alwaysCheckListListListListlentePtotoVoidToavoIndexIndexIndexIndexIndexIndExerror。

Python的科学计算中如何使用阵列?Python的科学计算中如何使用阵列?Apr 25, 2025 am 12:28 AM

Arraysinpython,尤其是Vianumpy,ArecrucialInsCientificComputingfortheireftheireffertheireffertheirefferthe.1)Heasuedfornumerericalicerationalation,dataAnalysis和Machinelearning.2)Numpy'Simpy'Simpy'simplementIncressionSressirestrionsfasteroperoperoperationspasterationspasterationspasterationspasterationspasterationsthanpythonlists.3)inthanypythonlists.3)andAreseNableAblequick

您如何处理同一系统上的不同Python版本?您如何处理同一系统上的不同Python版本?Apr 25, 2025 am 12:24 AM

你可以通过使用pyenv、venv和Anaconda来管理不同的Python版本。1)使用pyenv管理多个Python版本:安装pyenv,设置全局和本地版本。2)使用venv创建虚拟环境以隔离项目依赖。3)使用Anaconda管理数据科学项目中的Python版本。4)保留系统Python用于系统级任务。通过这些工具和策略,你可以有效地管理不同版本的Python,确保项目顺利运行。

与标准Python阵列相比,使用Numpy数组的一些优点是什么?与标准Python阵列相比,使用Numpy数组的一些优点是什么?Apr 25, 2025 am 12:21 AM

numpyarrayshaveseveraladagesoverandastardandpythonarrays:1)基于基于duetoc的iMplation,2)2)他们的aremoremoremorymorymoremorymoremorymoremorymoremoremory,尤其是WithlargedAtasets和3)效率化,效率化,矢量化函数函数函数函数构成和稳定性构成和稳定性的操作,制造

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具