шаблони дизайну пітона [закрито]


166

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



Відповіді:


152

Деякі в них перекриваються

Проміжна та вдосконалена столярна програма в Python

Код, як Pythonista: Idiomatic Python

Ідіоми та ефективність пітона

День розробників Google США - Шаблони дизайну Python

Інший ресурс є на прикладі рецептів Python . Хороша кількість не дотримується кращих практик, але ви можете знайти там деякі корисні моделі


1
Третя ланка мертва. Спробував знайти дзеркало, але не зміг. Якщо хтось має правильне посилання, будь ласка, додайте
formatkaka

1
Там же, ідіоми і ефективність Python, схоже, не працюють.
Давід Лашук

Перша та друга посилання були мертвими, тому я оновив їх знімками з Інтернет-архіву. Вони, здається, дуже старі, хоча я впевнений, що багато з них все ще актуальні.
mannykary

24

Тип

>>> import this

в консолі Python.

Хоча це зазвичай трактується як (прекрасний!) Жарт, він містить пару дійсних аксіом, характерних для пітона.



6

Почати можна тут і тут .

Для більш глибокого огляду дизайнерських паркетів слід переглянути схеми дизайну: елементи багаторазового об’єктно-орієнтованого програмного забезпечення . Вихідний код відсутній у Python, але він не повинен бути для вас, щоб зрозуміти шаблони.


8
Я думаю, що важливо зрозуміти, як використовувати ідіоматичний пітон для реалізації моделей дизайну. Це зовсім інша мова, ніж C ++, яка використовується в GOF, тому перенесення з C ++ на python призведе до непітонічного коду.
sakisk

1
Я схильний не погоджуватися. Однотонний DP чи інший DP буде можливим на будь-якій мові ОО, будь то Python, Java або C ++. Що на ваш погляд є непітонічним?
Пол Хіемстра

1
Перше посилання - це досить бідний документ, з багатьма помилковими твердженнями про Python. Другий на даний момент 404-х, таким чином, я думаю, завдає набагато меншої шкоди :)
Брендон Родос,

6

Щось ви можете використати для спрощення свого коду під час виклику атрибутів на об'єктах, які можуть бути або не існувати, - це використовувати шаблон дизайну Null Object Design (до якого я був представлений у 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; у статті йдеться про схемоподібну мову, яка є, з того, що я можу сказати, винайдена на місці для цього конкретного документа. Якщо б запитуючий не був: (а) академічним комп'ютерним вченим із (б) багаторічним досвідом роботи з Python, я сумніваюся, чи могли б вони отримати щось цінне з паперу - і, до речі, вони, певно, не задали б цього питання на першому місці. :)
Брендон Родос,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.