modèles de conception python [fermé]

166

Je recherche des ressources qui donnent des exemples de bonnes pratiques, de modèles de conception et des principes SOLID utilisant Python.

Ted Smith
la source

Réponses:

152

Certains se chevauchent dans ces

Menuiserie logicielle intermédiaire et avancée en Python

Code comme un Pythonista: Python idiomatique

Idiomes et efficacité Python

Google Developers Day US - Modèles de conception Python

Une autre ressource est par exemple dans les recettes Python . Un bon nombre ne suit pas les meilleures pratiques, mais vous pouvez y trouver des modèles utiles

Ed.
la source
1
Le troisième lien est mort. J'ai essayé de trouver un miroir mais je
n'ai
1
Pareil ici, les idiomes et l'efficacité Python ne semblent pas fonctionner.
Dawid Laszuk
Les premier et deuxième liens étaient morts, je les ai donc mis à jour avec des instantanés Internet Archive. Ils semblent cependant très anciens, même si je suis sûr que beaucoup d'entre eux sont encore pertinents.
mannykary
24

Type

>>> import this

dans une console Python.

Bien que cela soit généralement traité comme une blague (très bien!), Il contient quelques axiomes valides spécifiques à python.

Anonyme
la source
6

Vous pouvez commencer ici et ici .

Pour un examen plus approfondi des modèles de conception, vous devriez consulter Modèles de conception: éléments de logiciels orientés objet réutilisables . Le code source n'est pas en Python, mais il n'est pas nécessaire que vous compreniez les modèles.

Brian R. Bondy
la source
8
Je pense qu'il est important de comprendre comment utiliser python idiomatique pour implémenter des modèles de conception. C'est un langage très différent du C ++ qui est utilisé dans GOF donc le portage de C ++ vers python aboutira à un code non pythonique.
sakisk du
1
J'ai tendance à ne pas être d'accord. Un DP singleton ou d'autres DP seront possibles dans n'importe quel langage OO, que ce soit Python, Java ou C ++. Qu'est-ce qui n'est pas pythonique à votre avis?
Paul Hiemstra
1
Le premier lien est un article assez médiocre, avec de nombreuses affirmations erronées sur Python. Le deuxième actuellement 404, donc, je suppose, fait beaucoup moins de dégâts :)
Brandon Rhodes
6

Quelque chose que vous pouvez utiliser pour simplifier votre code lors de l'appel d'attributs sur des objets qui peuvent ou non exister est d'utiliser le modèle de conception d'objet nul (auquel j'ai été introduit dans Python Cookbook ).

En gros, l'objectif avec les objets Null est de fournir un remplacement «intelligent» pour le type de données primitif souvent utilisé None en Python ou Null (ou pointeurs Null) dans d'autres langages. Ceux-ci sont utilisés à de nombreuses fins, y compris le cas important où un membre d'un groupe d'éléments par ailleurs similaires est spécial pour une raison quelconque. Le plus souvent, cela se traduit par des instructions conditionnelles pour faire la distinction entre les éléments ordinaires et la valeur primitive Null.

Cet objet mange simplement l'absence d'erreur d'attribut et vous pouvez éviter de vérifier leur existence.

Ce n'est rien de plus 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"

Avec cela, si vous le faites, Null("any", "params", "you", "want").attribute_that_doesnt_exists()cela n'explosera pas, mais deviendra silencieusement l'équivalent de pass.

Normalement, vous feriez quelque chose comme

if obj.attr:
    obj.attr()

Avec cela, vous faites simplement:

obj.attr()

et oubliez ça. Attention, une utilisation intensive de l' Nullobjet peut potentiellement masquer des bogues dans votre code.

Esteban Küber
la source
3

Vous pouvez également lire cet article (sélectionnez le fichier .pdf), qui traite des modèles de conception dans les langages orientés objet dynamiques (p. Ex. Python). Pour citer la page:

Cet article explore comment les modèles du livre "Gang of Four", ou "GOF", comme on l'appelle souvent, apparaissent lorsque des problèmes similaires sont traités à l'aide d'un langage de programmation dynamique, d'ordre supérieur et orienté objet. Certains des modèles disparaissent - c'est-à-dire qu'ils sont pris en charge directement par les fonctionnalités du langage, certains modèles sont plus simples ou ont un objectif différent, et certains sont essentiellement inchangés.

Gilad Naor
la source
1
La question concernait Python; l'article parle d'un langage de type Scheme qui est, d'après ce que je peux dire, inventé sur place pour cet article en particulier. À moins que l'interlocuteur ne soit (a) un informaticien universitaire avec (b) une longue expérience des pratiques Python, je doute qu'ils aient pu tirer quelque chose de valeur du papier - et, plus précisément, ils n'auraient probablement pas posé cette question en premier lieu. :)
Brandon Rhodes