wzorce projektowe Pythona [zamknięte]


166

Szukam wszelkich zasobów, które zawierają przykłady najlepszych praktyk, wzorców projektowych i zasad SOLID przy użyciu Pythona.



Odpowiedzi:


152

Niektóre z nich się pokrywają

Średnio zaawansowana i zaawansowana stolarka programowa w Pythonie

Code Like a Pythonista: Idiomatic Python

Idiomy Pythona i wydajność

Dzień Google Developers Day w USA - wzorce projektowe w języku Python

Inny zasób jest na przykład w Python Recipes . Dobra liczba nie jest zgodna z najlepszymi praktykami, ale można znaleźć w nich przydatne wzorce


1
Trzecie łącze nie działa. Próbowałem znaleźć lustro, ale nie mogłem, jeśli ktoś ma poprawny link, dodaj
formatkaka

1
To samo tutaj, Python Idioms and Efficiency wydaje się nie działać.
Dawid Laszuk

Pierwszy i drugi link były martwe, więc zaktualizowałem je migawkami z Internet Archive. Wyglądają jednak na bardzo stare, chociaż jestem pewien, że wiele z nich jest nadal aktualnych.
mannykary

24

Rodzaj

>>> import this

w konsoli Pythona.

Chociaż jest to zwykle traktowane jako (dobrze!) Żart, zawiera kilka prawidłowych aksjomatów specyficznych dla Pythona.



6

Możesz zacząć tutaj i tutaj .

Aby dokładniej przyjrzeć się projektantom, należy zapoznać się z tematem Wzorce projektowe: elementy oprogramowania obiektowego wielokrotnego użytku . Kod źródłowy nie jest napisany w Pythonie, ale nie musi być, abyś zrozumiał wzorce.


8
Myślę, że ważne jest, aby zrozumieć, jak używać idiomatycznego Pythona do implementacji wzorców projektowych. Jest to zupełnie inny język niż C ++, który jest używany w GOF, więc przeniesienie z C ++ do Pythona spowoduje powstanie kodu innego niż Python.
sakisk

1
Raczej się nie zgadzam. Pojedynczy DP lub inny DP będzie możliwy w każdym języku OO, czy to Python, Java czy C ++. Co Twoim zdaniem nie jest pytonem?
Paul Hiemstra

1
Pierwsze łącze to dość kiepski artykuł, zawierający wiele błędnych twierdzeń na temat Pythona. Drugi obecnie 404, więc przypuszczam, robi znacznie mniej szkód :)
Brandon Rhodes

6

Coś, czego możesz użyć, aby uprościć swój kod podczas wywoływania atrybutów obiektów, które mogą istnieć lub nie, to użycie wzorca projektowego obiektu Null (do którego zostałem wprowadzony w Python Cookbook ).

Z grubsza, celem obiektów Null jest zapewnienie „inteligentnego” zamiennika dla często używanego pierwotnego typu danych None w Pythonie lub Null (lub wskaźnikach Null) w innych językach. Są one używane do wielu celów, w tym w ważnym przypadku, gdy jeden członek pewnej grupy skądinąd podobnych elementów jest wyjątkowy z jakiegokolwiek powodu. Najczęściej powoduje to warunkowe instrukcje rozróżniania zwykłych elementów od pierwotnej wartości Null.

Ten obiekt po prostu zjada brak błędu atrybutu i możesz uniknąć sprawdzania ich istnienia.

To nic więcej niż

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"

Dzięki temu, jeśli to zrobisz Null("any", "params", "you", "want").attribute_that_doesnt_exists(), nie wybuchnie, ale po cichu stanie się odpowiednikiem pass.

Normalnie zrobiłbyś coś takiego

if obj.attr:
    obj.attr()

Dzięki temu po prostu wykonaj:

obj.attr()

i zapomnij o tym. Uważaj, ponieważ intensywne użycie Nullobiektu może potencjalnie ukryć błędy w kodzie.


3

Możesz także chcieć przeczytać ten artykuł (wybierz plik .pdf), który omawia wzorce projektowe w dynamicznych językach obiektowych (np. Python). Aby zacytować stronę:

Artykuł bada, w jaki sposób wzorce z książki „Gang of Four” lub „GOF”, jak się ją często nazywa, pojawiają się, gdy podobne problemy są rozwiązywane za pomocą dynamicznego, obiektowego języka programowania wyższego rzędu. Niektóre wzorce znikają - to znaczy są wspierane bezpośrednio przez funkcje języka, niektóre wzorce są prostsze lub mają inny charakter, a niektóre pozostają w zasadzie niezmienione.


1
Pytanie dotyczyło Pythona; artykuł mówi o języku podobnym do schematu, czyli z tego, co wiem, wymyślonym na miejscu dla tego konkretnego artykułu. O ile pytającym nie jest (a) akademicki informatyk z (b) długim doświadczeniem w praktykach Pythona, wątpię, czy mogliby wyciągnąć cokolwiek wartościowego z artykułu - a co więcej, prawdopodobnie nie zadaliby tego pytania na pierwszym miejscu. :)
Brandon Rhodes
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.