pattern di design in pitone [chiuso]


166

Sto cercando qualsiasi risorsa che fornisca esempi di Best Practices, Pattern di progettazione e principi SOLID usando Python.



Risposte:


152

Alcuni si sovrappongono in questi

Carpenteria software intermedia e avanzata in Python

Code Like a Pythonista: Idiomatic Python

Idiomi ed efficienza di Python

Google Developers Day US - Python Design Patterns

Un'altra risorsa è ad esempio nelle ricette Python . Un buon numero non segue le migliori pratiche ma è possibile trovare alcuni schemi utili


1
Il terzo link è morto. Ho cercato di trovare il mirror ma non ci sono riuscito, se qualcuno ha il link corretto per favore aggiungi
formatkaka il

1
Lo stesso qui, Python Idiomi ed efficienza non sembrano funzionare.
Dawid Laszuk,

Il primo e il secondo link erano morti, quindi li ho aggiornati con gli snapshot di Internet Archive. Sembrano essere molto vecchi, anche se sono sicuro che molto è ancora rilevante.
mannykary,

24

genere

>>> import this

in una console Python.

Sebbene questo sia generalmente trattato come uno scherzo (bene!), Contiene un paio di assiomi validi specifici per il pitone.



6

Puoi iniziare qui e qui .

Per uno sguardo più approfondito ai partecipanti al design, dovresti esaminare Design Patterns: Elements of Reusable Object-Oriented Software . Il codice sorgente non è in Python, ma non è necessario che tu comprenda gli schemi.


8
Penso che sia importante capire come usare il pitone idiomatico per implementare modelli di progettazione. È un linguaggio molto diverso da C ++ che viene utilizzato in GOF, pertanto il porting da C ++ a Python comporterà codice non pythonic.
sakisk,

1
Tendo a non essere d'accordo. Un DP singleton o altri DP saranno possibili in qualsiasi linguaggio OO, sia esso Python, Java o C ++. Che cosa non è pitonico secondo te?
Paul Hiemstra,

1
Il primo link è un articolo piuttosto scadente, con molte asserzioni errate su Python. Il secondo attualmente 404, quindi, suppongo, facendo molto meno danni :)
Brandon Rhodes,

6

Qualcosa che puoi usare per semplificare il tuo codice quando chiami attributi su oggetti che potrebbero o meno esistere è usare il Null Object Design Pattern (a cui sono stato introdotto in Python Cookbook ).

All'incirca, l'obiettivo con gli oggetti Null è quello di fornire una sostituzione "intelligente" per il tipo di dati primitivo spesso usato None in Python o Null (o puntatori Null) in altre lingue. Questi sono usati per molti scopi incluso il caso importante in cui un membro di un gruppo di elementi altrimenti simili è speciale per qualsiasi motivo. Molto spesso ciò si traduce in istruzioni condizionali per distinguere tra elementi ordinari e il valore Null primitivo.

Questo oggetto mangia solo la mancanza dell'errore di attributo e puoi evitare di verificarne l'esistenza.

Non è altro che

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"

Con questo, se lo fai Null("any", "params", "you", "want").attribute_that_doesnt_exists()non esploderà, ma diventerà silenziosamente l'equivalente di pass.

Normalmente faresti qualcosa del genere

if obj.attr:
    obj.attr()

Con questo, fai semplicemente:

obj.attr()

e non pensarci più. Attenzione che un uso estensivo Nulldell'oggetto può potenzialmente nascondere bug nel codice.


3

Potresti anche voler leggere questo articolo (seleziona il file .pdf), che tratta i modelli di progettazione in linguaggi dinamici orientati agli oggetti (ad esempio Python). Per citare la pagina:

Questo documento esplora come i modelli della "Banda dei quattro", o libro "GOF", come viene spesso chiamato, compaiono quando problemi simili vengono affrontati usando un linguaggio di programmazione dinamico, di ordine superiore, orientato agli oggetti. Alcuni dei pattern scompaiono, ovvero sono supportati direttamente dalle funzionalità del linguaggio, alcuni sono più semplici o hanno un focus diverso e alcuni sono sostanzialmente invariati.


1
La domanda riguardava Python; l'articolo parla del linguaggio simile a Scheme che, da quello che posso dire, è stato inventato sul posto per questo particolare articolo. A meno che l'interrogatore non sia (a) uno scienziato informatico accademico con (b) una lunga esperienza con le pratiche Python, dubito che avrebbero potuto ottenere qualcosa di valore dalla carta - e, più precisamente, probabilmente non avrebbero posto questa domanda innanzitutto. :)
Brandon Rhodes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.