2009-03-03 94 views
147

我正在尋找提供最佳實踐,設計模式和使用Python的SOLID原則示例的任何資源。python設計模式

+0

Duplicate:http://stackoverflow.com/questions/127377/programming-languages-and-design-patterns,http://stackoverflow.com/questions/546479/do-oo-design-principles-apply-to -python,http://stackoverflow.com/questions/112358/what-are-some-good-web-resources-for-learning-object-oriented-programming – 2009-03-04 12:21:19

+0

https://github.com/faif/python-patterns /blob/master/README.md – 2017-03-02 12:48:57

回答

6

您可以開始使用herehere

欲瞭解更多深入瞭解設計pattners,你應該看看Design Patterns: Elements of Reusable Object-Oriented Software。源代碼不在Python中,但它不需要讓你理解模式。

+7

我認爲理解如何使用慣用的python來實現設計模式非常重要。它與GOF中使用的C++語言完全不同,因此從C++移植到python將導致非pythonic代碼。 – ierax 2011-07-31 20:29:17

+1

我傾向於不同意。無論是Python,Java還是C++,任何OO語言都可以使用單例DP或其他DP。你認爲什麼是非pythonic? – 2012-02-23 21:13:18

+1

第一個鏈接是一篇相當差的論文,有很多關於Python的錯誤斷言。目前第二個404的,因此,我想,做得少得多:) – 2012-07-26 21:56:42

2

您也不妨讀一讀這article(選擇.pdf文件),其中討論了在面向對象的動態語言的設計模式(即蟒蛇)。引用該頁:

本文探討了如何使用動態更高階的問題解決類似問題時,通常稱爲「四人幫」或「GOF」 ,面向對象的編程語言。一些模式消失 - 也就是說,它們直接受到語言特徵的支持,一些模式更簡單或者有不同的重點,有些模式基本不變。

24

在Python控制檯類型

>>> import this 

嚴重傾斜。

雖然這通常被視爲一個(罰款!)笑話,它包含了一些有效的python特定公理。

5

在調用可能存在或不存在的對象上的屬性時,可以用來簡化代碼的東西是使用Null Object Design Pattern(我在Python Cookbook中引入的對象)。

粗略地說,與空對象的目標是提供一種「智能」 替換爲其他語言的在Python或 空經常使用的原始數據類型沒有限制(或空指針)。這些用於許多目的,包括一些重要情況,其中一些組別的其中一個成員 由於任何原因是特殊的。大多數 通常會導致條件語句區分 普通元素和原始Null值。

該對象只是吃缺乏屬性錯誤,你可以避免檢查它們的存在。

這無非

class Null(object): 

    def __init__(self, *args, **kwargs): 
     "Ignore parameters." 
     return None 

    def __call__(self, *args, **kwargs): 
     "Ignore method calls." 
     return self 

    def __getattr__(self, mname): 
     "Ignore attribute requests." 
     return self 

    def __setattr__(self, name, value): 
     "Ignore attribute setting." 
     return self 

    def __delattr__(self, name): 
     "Ignore deleting attributes." 
     return self 

    def __repr__(self): 
     "Return a string representation." 
     return "<Null>" 

    def __str__(self): 
     "Convert to a string and return it." 
     return "Null" 

有了這個,如果你這樣做Null("any", "params", "you", "want").attribute_that_doesnt_exists()它不會爆炸,但只是默默地成爲pass相當。

通常情況下你會做這樣的事情

if obj.attr: 
    obj.attr() 

有了這個,你只是做:

obj.attr() 

,並忘掉它。請注意,廣泛使用Null對象可能會隱藏代碼中的錯誤。