Python-Designmuster [geschlossen]


166

Ich suche nach Ressourcen, die Beispiele für Best Practices, Entwurfsmuster und die SOLID-Prinzipien mit Python enthalten.



Antworten:


152

Einige überschneiden sich in diesen

Intermediate und Advanced Software Carpentry in Python

Code wie ein Pythonista: Idiomatisches Python

Python-Redewendungen und Effizienz

Google Developers Day US - Python-Entwurfsmuster

Eine weitere Ressource ist beispielsweise die Python-Rezepte . Eine gute Anzahl folgt nicht den Best Practices, aber Sie können dort einige Muster finden, die nützlich sind


1
Der dritte Link ist tot. Versucht, Spiegel zu finden, konnte aber nicht, Wenn jemand den richtigen Link hat, fügen Sie bitte
formatkaka

1
Auch hier scheinen Python-Redewendungen und Effizienz nicht zu funktionieren.
Dawid Laszuk

Der erste und der zweite Link waren tot, daher habe ich sie mit Internetarchiv-Snapshots aktualisiert. Sie scheinen jedoch sehr alt zu sein, obwohl ich sicher bin, dass vieles noch relevant ist.
Mannykary

24

Art

>>> import this

in einer Python-Konsole.

Obwohl dies normalerweise als (feiner!) Witz behandelt wird, enthält es einige gültige pythonspezifische Axiome.



6

Sie können hier und hier loslegen .

Weitere Informationen zu Designmustern finden Sie unter Designmuster: Elemente wiederverwendbarer objektorientierter Software . Der Quellcode ist nicht in Python, muss aber nicht vorhanden sein, damit Sie die Muster verstehen.


8
Ich denke, dass es wichtig ist zu verstehen, wie man idiomatisches Python zum Implementieren von Entwurfsmustern verwendet. Es ist eine ganz andere Sprache als C ++, die in GOF verwendet wird. Daher führt die Portierung von C ++ nach Python zu nicht-pythonischem Code.
Sakisk

1
Ich bin eher anderer Meinung. Ein Singleton-DP oder andere DPs sind in jeder OO-Sprache möglich, egal ob Python, Java oder C ++. Was ist Ihrer Meinung nach nicht pythonisch?
Paul Hiemstra

1
Der erste Link ist ein ziemlich schlechtes Papier mit vielen falschen Aussagen über Python. Die zweite derzeit 404, also, ich nehme an, viel weniger Schaden anrichten :)
Brandon Rhodes

6

Sie können Ihren Code vereinfachen, wenn Sie Attribute für Objekte aufrufen, die möglicherweise vorhanden sind oder nicht, indem Sie das Null-Objekt-Entwurfsmuster verwenden (das mir in Python Cookbook vorgestellt wurde ).

In etwa besteht das Ziel von Null-Objekten darin, den häufig verwendeten primitiven Datentyp None in Python oder Null (oder Null-Zeiger) in anderen Sprachen "intelligent" zu ersetzen. Diese werden für viele Zwecke verwendet, einschließlich des wichtigen Falls, in dem ein Mitglied einer Gruppe ansonsten ähnlicher Elemente aus irgendeinem Grund etwas Besonderes ist. Meistens führt dies zu bedingten Anweisungen zur Unterscheidung zwischen gewöhnlichen Elementen und dem primitiven Nullwert.

Dieses Objekt frisst nur das Fehlen von Attributfehlern, und Sie können vermeiden, auf ihre Existenz zu prüfen.

Es ist nichts weiter als

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"

Wenn Sie dies tun Null("any", "params", "you", "want").attribute_that_doesnt_exists(), explodiert es nicht, sondern wird stillschweigend zum Äquivalent von pass.

Normalerweise würden Sie so etwas tun

if obj.attr:
    obj.attr()

Damit machen Sie einfach:

obj.attr()

und vergiss es. Beachten Sie, dass eine umfassende Verwendung des NullObjekts möglicherweise Fehler in Ihrem Code verbergen kann.


3

Möglicherweise möchten Sie auch diesen Artikel lesen (wählen Sie die PDF-Datei aus), in dem Entwurfsmuster in dynamischen objektorientierten Sprachen (z. B. Python) erläutert werden. Um die Seite zu zitieren:

In diesem Artikel wird untersucht, wie die Muster aus dem Buch "Gang of Four" oder "GOF", wie es oft genannt wird, erscheinen, wenn ähnliche Probleme mit einer dynamischen, objektorientierten Programmiersprache höherer Ordnung angegangen werden. Einige der Muster verschwinden - das heißt, sie werden direkt von Sprachfunktionen unterstützt, einige Muster sind einfacher oder haben einen anderen Fokus, andere bleiben im Wesentlichen unverändert.


1
Die Frage betraf Python; Das Papier spricht über eine schemaähnliche Sprache, die, soweit ich das beurteilen kann, vor Ort für dieses spezielle Papier erfunden wurde. Wenn der Fragesteller nicht (a) ein akademischer Informatiker mit (b) langjähriger Erfahrung mit Python-Praktiken ist, bezweifle ich, dass sie etwas Wertvolles aus dem Papier herausholen könnten - und genauer gesagt, sie hätten diese Frage wahrscheinlich nicht gestellt an erster Stelle. :)
Brandon Rhodes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.