2009-03-03 27 views
147

Estoy buscando cualquier recurso que dé ejemplos de mejores prácticas, patrones de diseño y principios SOLID usando Python.patrones de diseño python

+0

Duplicado: 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 –

Respuesta

143

Algunos superposición de estos

Intermediate and Advanced Software Carpentry in Python

Code Like a Pythonista: Idiomatic Python

Python Idioms and Efficiency

Google Developers Day US - Python Design Patterns

Otro recurso es por ejemplo en el Python Recipes. Un buen número no sigue las mejores prácticas pero puede encontrar algunos patrones que son útiles

+0

El tercer enlace está muerto. Traté de encontrar el espejo pero no pude, si alguien tiene el enlace correcto, por favor agregue – formatkaka

+0

Lo mismo aquí, _Python Idioms and Efficiency_ no parece funcionar. –

6

Puede comenzar here y here.

Para una explicación más detallada de los patrones de diseño, debe consultar Design Patterns: Elements of Reusable Object-Oriented Software. El código fuente no está en Python, pero no necesita ser para que entiendas los patrones.

+7

Creo que es importante entender cómo usar idiomatic python para implementar patrones de diseño. Es un lenguaje muy diferente de C++ que se utiliza en GOF, por lo que la conversión de C++ a python dará como resultado un código no pitónico. – ierax

+1

Tiendo a estar en desacuerdo. Un DP singleton u otro DP será posible en cualquier lenguaje OO, ya sea Python, Java o C++. ¿Qué es no-pitónico en tu opinión? –

+1

El primer enlace es un documento bastante pobre, con muchas afirmaciones erróneas sobre Python. El segundo actualmente en 404, por lo tanto, supongo, haciendo mucho menos daño :) –

2

También puede leer este article (seleccione el archivo .pdf), que trata sobre los patrones de diseño en lenguajes orientados a objetos dinámicos (es decir, Pitón). Para citar la página:

Este documento explora cómo los patrones del libro "Gang of Four", o "GOF", como se llama a menudo, aparecen cuando se abordan problemas similares usando un orden dinámico, de orden superior , lenguaje de programación orientado a objetos. Algunos de los patrones desaparecen, es decir, son compatibles directamente con las características del lenguaje, algunos patrones son más simples o tienen un enfoque diferente, y algunos están esencialmente sin cambios.

+1

La pregunta era sobre Python; el documento habla sobre un lenguaje similar al de Scheme que, por lo que puedo decir, inventó sobre el terreno para este artículo en particular. A menos que el interlocutor sea (a) un científico informático académico con (b) larga experiencia con las prácticas de Python, dudo que puedan obtener algo valioso del documento, y, más al punto, probablemente no habrían hecho esta pregunta. en primer lugar. :) –

12

Bruce Eckel de "Thinking in Python" apoya fuertemente en los patrones de diseño

+1

Tenga en cuenta que de acuerdo con [wiki] (http://wiki.python.org/moin/AdvancedBooks) este libro ya no se mantiene. – ierax

24

Tipo

>>> import this 

en una consola Python.

Aunque esto generalmente se trata como una broma (¡excelente!), Contiene un par de axiomas válidos específicos de Python.

5

Algo que puede utilizar para simplificar su código al llamar a atributos en objetos que podrían o no existir es usar el Null Object Design Pattern (al que me presentaron en Python Cookbook).

A grandes rasgos, el objetivo con objetos nulos es proporcionar una 'inteligente' reemplazo para el uso frecuente tipo de datos primitivo Ninguno en Python o nulo (o punteros nulos) en otros idiomas. Estos se usan para muchos propósitos de , incluido el caso importante en el que un miembro de un grupo de elementos similares es especial por alguna razón. La mayoría de los a menudo esto da como resultado declaraciones condicionales para distinguir entre elementos ordinarios y el valor nulo primitivo.

Este objeto simplemente come la falta de error de atributo, y puede evitar comprobar su existencia.

No es nada más que

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 esto, si lo hace Null("any", "params", "you", "want").attribute_that_doesnt_exists() no va a explotar, pero sólo en silencio convertido en el equivalente de pass.

Lo normal sería hacer algo como

if obj.attr: 
    obj.attr() 

Con esto, usted acaba de hacer:

obj.attr() 

y olvidarse de él. Tenga en cuenta que el uso extensivo del objeto Null puede ocultar errores en su código.