2009-03-03 22 views
147

Sono alla ricerca di risorse che forniscano esempi di best practice, modelli di progettazione e principi SOLID che utilizzano Python.modelli di disegno pitone

+0

Duplicato: http://stackoverflow.com/questions/127377/programming-languages-and-design-patterns, http://stackoverflow.com/questions/546479/do-oo-design-principles-apply-to -python, http://stackoverflow.com/questions/112358/what-are-some-good-web-resources-for-learning-object-oriented-programming –

+0

https://github.com/faif/python-patterns /blob/master/README.md –

risposta

143

Alcuni si sovrappongono in questi

Intermediate and Advanced Software Carpentry in Python

Code Like a Pythonista: Idiomatic Python

Python Idioms and Efficiency

Google Developers Day US - Python Design Patterns

Un'altra risorsa è l'esempio al Python Recipes. Un buon numero non segue le migliori pratiche ma è possibile trovare alcuni modelli in là che sono utili

+0

Il terzo link è morto. Ho cercato di trovare lo specchio ma non potrei, Se qualcuno ha il link corretto, per favore aggiungi – formatkaka

+0

Lo stesso qui, _Python Idioms and Efficiency_ non sembra funzionare. –

6

È possibile iniziare here e here.

Per uno sguardo più approfondito ai modelli di progettazione, è necessario consultare Design Patterns: Elements of Reusable Object-Oriented Software. Il codice sorgente non è in Python, ma non è necessario che tu capisca i pattern.

+7

Penso che sia importante capire come usare Python idiomatico per implementare modelli di progettazione. È un linguaggio molto diverso dal C++ che viene usato in GOF, quindi il porting da C++ a python darà come risultato un codice non-pythonic. – ierax

+1

Tendo a non essere d'accordo. Un DP singleton o altri DP saranno possibili in qualsiasi linguaggio OO, che si tratti di Python, Java o C++. Che cosa è non-pythonic secondo te? –

+1

Il primo collegamento è un documento piuttosto scadente, con molte affermazioni errate su Python. Il secondo attualmente 404, quindi, suppongo, facendo molto meno danno :) –

2

Si potrebbe anche voler leggere questo article (selezionare il file .pdf), che discute i modelli di progettazione in linguaggi orientati agli oggetti dinamici (cioè Pitone). Per citare la pagina:

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

+1

La domanda riguardava Python; il documento parla del linguaggio simile a Scheme che è, da quello che posso dire, inventato sul posto per questo particolare articolo. A meno che l'interrogante non sia (a) uno scienziato informatico accademico con (b) lunga esperienza con le pratiche di Python, dubito che possano ottenere qualcosa di valore dal giornale - e, più precisamente, probabilmente non avrebbero fatto questa domanda innanzitutto. :) –

12

Bruce Eckel di "Thinking in Python" si appoggia pesantemente su Design Patterns

+1

Nota che secondo [wiki] (http://wiki.python.org/moin/AdvancedBooks) questo libro non viene più mantenuto. – ierax

24

Tipo

>>> import this 

in una console Python.

Sebbene questo sia solitamente trattato come una battuta (fine!), Contiene un paio di assiomi validi specifici per Python.

5

Qualcosa che è possibile utilizzare per semplificare il codice quando si chiamano attributi su oggetti che potrebbero o non potrebbero esistere è utilizzare Null Object Design Pattern (a cui sono stato introdotto in Python Cookbook).

Approssimativamente, il gol con gli oggetti Null è di fornire un 'intelligente' sostituzione per l'usato spesso primitivo tipo di dati Nessuno 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 qualche gruppo di elementi altrimenti simili è speciale per qualsiasi motivo. La maggior parte di spesso restituisce istruzioni condizionali per distinguere tra gli elementi ordinari e il valore Null primitivo.

Questo oggetto mangia solo la mancanza di errore di attributo ed è possibile evitare di verificarne l'esistenza.

Non è niente di più di

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 solo silenzio diventato l'equivalente di pass.

Normalmente si farebbe qualcosa di simile

if obj.attr: 
    obj.attr() 

Con questo, basta fare:

obj.attr() 

e non pensarci più. Fai attenzione che l'uso estensivo dell'oggetto Null può potenzialmente nascondere bug nel codice.