目錄
回复内容:
首頁 後端開發 Python教學 Python 里没有接口,如何写设计模式?

Python 里没有接口,如何写设计模式?

Jun 06, 2016 pm 04:22 PM
first head interface java 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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mysql安裝後怎麼使用 mysql安裝後怎麼使用 Apr 08, 2025 am 11:48 AM

文章介紹了MySQL數據庫的上手操作。首先,需安裝MySQL客戶端,如MySQLWorkbench或命令行客戶端。 1.使用mysql-uroot-p命令連接服務器,並使用root賬戶密碼登錄;2.使用CREATEDATABASE創建數據庫,USE選擇數據庫;3.使用CREATETABLE創建表,定義字段及數據類型;4.使用INSERTINTO插入數據,SELECT查詢數據,UPDATE更新數據,DELETE刪除數據。熟練掌握這些步驟,並學習處理常見問題和優化數據庫性能,才能高效使用MySQL。

PS羽化如何控製過渡的柔和度? PS羽化如何控製過渡的柔和度? Apr 06, 2025 pm 07:33 PM

羽化控制的關鍵在於理解其漸變本質。 PS本身不提供直接控制漸變曲線的選項,但你可以通過多次羽化、配合蒙版、精細選區,靈活調整半徑和漸變柔和度,實現自然過渡效果。

mysql安裝後怎麼優化數據庫性能 mysql安裝後怎麼優化數據庫性能 Apr 08, 2025 am 11:36 AM

MySQL性能優化需從安裝配置、索引及查詢優化、監控與調優三個方面入手。 1.安裝後需根據服務器配置調整my.cnf文件,例如innodb_buffer_pool_size參數,並關閉query_cache_size;2.創建合適的索引,避免索引過多,並優化查詢語句,例如使用EXPLAIN命令分析執行計劃;3.利用MySQL自帶監控工具(SHOWPROCESSLIST,SHOWSTATUS)監控數據庫運行狀況,定期備份和整理數據庫。通過這些步驟,持續優化,才能提升MySQL數據庫性能。

mysql 是否要付費 mysql 是否要付費 Apr 08, 2025 pm 05:36 PM

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

PS羽化怎麼設置? PS羽化怎麼設置? Apr 06, 2025 pm 07:36 PM

PS羽化是一種圖像邊緣模糊效果,通過在邊緣區域對像素加權平均實現。設置羽化半徑可以控制模糊程度,數值越大越模糊。靈活調整半徑可根據圖像和需求優化效果,如處理人物照片時使用較小半徑保持細節,處理藝術作品時使用較大半徑營造朦朧感。但需注意,半徑過大易丟失邊緣細節,過小則效果不明顯。羽化效果受圖像分辨率影響,且需要根據圖像理解和效果把握進行調整。

PS羽化對圖像質量有什麼影響? PS羽化對圖像質量有什麼影響? Apr 06, 2025 pm 07:21 PM

PS羽化會導致圖像細節丟失、色彩飽和度降低和噪點增加。為了減少影響,建議使用較小的羽化半徑,複製圖層後再羽化,以及仔細對比羽化前後圖像質量。此外,羽化並不適用於所有情況,有時蒙版等工具更適合處理圖像邊緣。

如何針對高負載應用程序優化 MySQL 性能? 如何針對高負載應用程序優化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

Bootstrap頁面如何預覽 Bootstrap頁面如何預覽 Apr 07, 2025 am 10:06 AM

Bootstrap頁面的預覽方法有:直接在瀏覽器中打開HTML文件;使用Live Server插件自動刷新瀏覽器;搭建本地服務器模擬線上環境。

See all articles