patrones de diseño de python [cerrado]

166

Estoy buscando recursos que den ejemplos de mejores prácticas, patrones de diseño y principios SÓLIDOS usando Python.

Ted Smith
fuente

Respuestas:

152

Alguna superposición en estos

Carpintería de software intermedia y avanzada en Python

Código como un pitonista: pitón idiomático

Modismos y eficiencia de Python

Google Developers Day US - Patrones de diseño de Python

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

Ed.
fuente
1
El tercer enlace está muerto. Intenté encontrar el espejo pero no pude. Si alguien tiene el enlace correcto, agregue
formatkaka
1
Lo mismo aquí, Python Idioms and Efficiency no parece funcionar.
Dawid Laszuk
El primer y el segundo enlace estaban muertos, así que los actualicé con instantáneas de Internet Archive. Sin embargo, parecen ser muy viejos, aunque estoy seguro de que muchos de ellos siguen siendo relevantes.
mannykary
24

Tipo

>>> import this

en una consola Python

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

Anónimo
fuente
6

Puedes empezar aquí y aquí .

Para una mirada más profunda a los patrones de diseño, debe mirar Patrones de diseño: elementos de software orientado a objetos reutilizables . El código fuente no está en Python, pero no es necesario que comprenda los patrones.

Brian R. Bondy
fuente
8
Creo que es importante comprender cómo usar Python idiomático para implementar patrones de diseño. Es un lenguaje muy diferente al de C ++ que se usa en GOF, por lo que portar de C ++ a Python dará como resultado un código no pitónico.
sakisk
1
Tiendo a estar en desacuerdo. Un DP singleton u otros DP serán posibles en cualquier lenguaje OO, ya sea Python, Java o C ++. ¿Qué es no pitónico en tu opinión?
Paul Hiemstra
1
El primer enlace es un documento bastante pobre, con muchas afirmaciones erróneas sobre Python. El segundo actualmente es de 404, por lo tanto, supongo, haciendo mucho menos daño :)
Brandon Rhodes
6

Algo que puede usar para simplificar su código al invocar atributos en objetos que pueden o no existir es usar el Patrón de diseño de objetos nulos (al que me introduje en Python Cookbook ).

Aproximadamente, el objetivo con los objetos nulos es proporcionar un reemplazo 'inteligente' para el tipo de datos primitivos frecuentemente utilizado Ninguno en Python o Nulo (o punteros nulos) en otros idiomas. Estos se utilizan para muchos propósitos, incluido el caso importante en el que un miembro de algún grupo de elementos similares es especial por cualquier razón. Muy a menudo, esto da como resultado declaraciones condicionales para distinguir entre elementos ordinarios y el valor nulo primitivo.

Este objeto solo come la falta de error de atributo y puede evitar verificar 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 haces Null("any", "params", "you", "want").attribute_that_doesnt_exists(), no explotará, sino que en silencio se convertirá en el equivalente de pass.

Normalmente harías algo como

if obj.attr:
    obj.attr()

Con esto, solo haces:

obj.attr()

y olvídalo. Tenga en cuenta que el uso extensivo del Nullobjeto puede ocultar errores en su código.

Esteban Küber
fuente
3

También puede leer este artículo (seleccione el archivo .pdf), que analiza los patrones de diseño en lenguajes dinámicos orientados a objetos (es decir, Python). Para citar la página:

Este artículo explora cómo los patrones del libro "Gang of Four", o "GOF", como se le llama a menudo, aparecen cuando se abordan problemas similares utilizando un lenguaje de programación dinámico, de orden superior y 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 permanecen esencialmente sin cambios.

Gilad Naor
fuente
1
La pregunta era sobre Python; El artículo habla sobre un lenguaje similar a Scheme que, por lo que puedo decir, fue inventado en el acto para este artículo en particular. A menos que el interlocutor sea (a) un científico informático académico con (b) una larga experiencia con las prácticas de Python, dudo que puedan sacar algo valioso del documento, y, más concretamente, probablemente no habrían hecho esta pregunta en primer lugar. :)
Brandon Rhodes