шаблоны проектирования Python [закрыто]

166

Я ищу любые ресурсы, которые дают примеры передового опыта, шаблонов проектирования и принципов SOLID с использованием Python.

Тед смит
источник

Ответы:

152

Некоторые совпадают в этих

Средний и продвинутый Software Carpentry в Python

Код, как Pythonista: идиоматический Python

Python идиомы и эффективность

День разработчиков Google США - шаблоны проектирования Python

Другой ресурс - пример на Рецептах Питона . Многие не следуют передовым методам, но вы можете найти там полезные шаблоны

ред.
источник
1
Третья ссылка мертва. Пытался найти зеркало, но не смог, Если у кого-то есть правильная ссылка, пожалуйста, добавьте
formatkaka
1
То же самое, Python Idioms and Efficiency , похоже, не работает.
Давид Ласзук
Первая и вторая ссылки были мертвы, поэтому я обновил их снимками интернет-архива. Они, кажется, очень старые, хотя я уверен, что многое из этого все еще актуально.
Мэнныкары
24

Тип

>>> import this

в консоли Python.

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

анонимное
источник
6

Вы можете начать здесь и здесь .

Для более глубокого изучения паттернов дизайна вы должны взглянуть на Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения . Исходный код не написан на Python, но вам не нужно понимать шаблоны.

Брайан Р. Бонди
источник
8
Я думаю, что важно понимать, как использовать идиоматический питон для реализации шаблонов проектирования. Это совсем другой язык, чем C ++, который используется в GOF, поэтому перенос с C ++ на python приведет к непитоническому коду.
Сакиск
1
Я склонен не соглашаться Одиночный DP или другие DP будут возможны на любом языке OO, будь то Python, Java или C ++. Что, по-вашему, не питоническое?
Пол Химстра
1
Первая ссылка - довольно плохая статья со многими ошибочными утверждениями о Python. Второе на данный момент 404-е, таким образом, я полагаю, наносит гораздо меньше урона :)
Брэндон Родс
6

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

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

Эстебан Кюбер
источник
3

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

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

Гилад Наор
источник
1
Вопрос был о Питоне; газета говорит о языке, подобном Схеме, который, насколько я могу судить, был изобретен на месте для этой конкретной статьи. Если бы спрашивающий не был (а) академическим специалистом по информатике с (б) большим опытом работы с Python, я сомневаюсь, что они могли бы получить что-то ценное из бумаги - и, более того, они, вероятно, не задали бы этот вопрос в первую очередь. :)
Брэндон Родс