2009-03-03 4 views
147

Я ищу любые ресурсы, которые приводят примеры лучших практик, шаблонов проектирования и принципов SOLID с использованием Python.шаблоны проектирования 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 –

+0

https://github.com/faif/python-patterns /blob/master/README.md –

ответ

143

Некоторые перекрытия в этих

Intermediate and Advanced Software Carpentry in Python

Code Like a Pythonista: Idiomatic Python

Python Idioms and Efficiency

Google Developers Day US - Python Design Patterns

Другой ресурс является примером в Python Recipes. Хорошее количество не соответствует лучшим практикам, но вы можете найти некоторые полезные там шаблоны

+0

Третье звено мертво. Пытался найти зеркало, но не смог. Если у кого-то есть правильная ссылка, добавьте – formatkaka

+0

. Здесь же, _Python Idioms и Efficiency_, похоже, не работают. –

6

Вы можете начать работу here и here.

Для более детального изучения рисунков вы должны посмотреть на Design Patterns: Elements of Reusable Object-Oriented Software. Исходный код не находится в Python, но вам не нужно понимать шаблоны.

+7

Я думаю, что важно понять, как использовать идиоматический питон для реализации шаблонов проектирования. Это совсем другой язык, чем C++, который используется в GOF, поэтому перенос с C++ на python приведет к непифоновскому коду. – ierax

+1

Я склонен не согласиться. Одноточечный DP или другие DP будут доступны на любом языке OO, будь то Python, Java или C++. Что, по вашему мнению, не является пифоническим? –

+1

Первая ссылка - довольно плохая бумага, с множеством ошибочных утверждений о Python. Вторым в настоящее время 404-м, таким образом, я полагаю, наношу гораздо меньше урона :) –

2

Возможно, вы также захотите прочитать это article (выберите файл .pdf), в котором обсуждаются шаблоны проектирования в динамических объектно-ориентированных языках (т. Е. Python). Процитирую страницу:

В данной статье рассматриваются как образцы из «банды четырех», или книги «GOF», как его часто называют, появляются, когда подобные проблемы решаются с помощью динамического, более высокого порядка , объектно-ориентированного языка программирования. Некоторые из шаблонов исчезают, т. Е. Поддерживаются непосредственно языковыми функциями, некоторые шаблоны проще или имеют другой фокус, а некоторые практически не изменяются.

+1

Вопрос был о Python; в документе говорится о языке, подобном Scheme, который, как я могу сказать, был изобретен на месте для этой конкретной статьи. Если допрашивающий не является (а) ученым-компьютерным ученым, (б) опыт работы с практикой Python, я сомневаюсь, что они могут получить что-то ценное из статьи - и, более того, они, вероятно, не задали бы этот вопрос в первую очередь. :) –

12

Брюс Eckel в "Thinking in Python" сильно опирается на шаблоны проектирования

+1

Обратите внимание, что в соответствии с [wiki] (http://wiki.python.org/moin/AdvancedBooks) эта книга больше не поддерживается. – ierax

24

Тип

>>> import this 

в консоли Python.

Хотя это обычно рассматривается как шутка (штраф!), Он содержит пару действительных аксиом, специфичных для python.

5

Что-то, что вы можете использовать для упрощения кода при вызове атрибутов объектов, которые могли бы или не существовали, - использовать Null Object Design Pattern (к которому я был добавлен в Python Cookbook).

Грубо говоря, цель с Null объектами является создание «интеллектуальной» замены для часто используемого примитивного типа данных None в Python или Null (или нулевых указателей) на других языках. Они используются для многих целей , включая важный случай, когда один элемент какой-либо группы аналогичных элементов по какой-либо причине является особенным. В большинстве случаев часто это приводит к условным операторам, чтобы различать обычных элементов и примитивное значение 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 может потенциально скрыть ошибки в вашем коде.

Смежные вопросы