Qu'est ce qu'un Pythonic façon pour l'Injection de Dépendances?

Introduction

Pour Java, l'Injection de Dépendance fonctionne comme pure de la POO, c'est à dire vous fournir une interface pour être mis en œuvre et dans votre code cadre accepter une instance d'une classe qui implémente l'interface définie.

Maintenant pour Python, vous êtes capable de faire la même façon, mais je pense que cette méthode a été trop frais généraux de droit dans le cas de Python. Alors comment voulez-vous mettre en œuvre dans le Pythonic façon?

Cas D'Utilisation

Dire que c'est le code de la structure:

class FrameworkClass():
    def __init__(self, ...):
        ...

    def do_the_job(self, ...):
        # some stuff
        # depending on some external function

L'Approche De Base

Le plus naïf (et peut-être le meilleur?) façon est d'exiger de la fonction externe pour être fourni dans la FrameworkClass constructeur, et ensuite être appelée à partir de la do_the_job méthode.

Code De La Structure:

class FrameworkClass():
    def __init__(self, func):
        self.func = func

    def do_the_job(self, ...):
        # some stuff
        self.func(...)

Code Client:

def my_func():
    # my implementation

framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)

Question

La question est de courte durée. Est-il mieux couramment utilisés Pythonic façon de le faire? Ou peut-être toutes les bibliothèques de l'appui d'une telle fonctionnalité?

Mise à JOUR: Situation Concrète

Imaginer que je développe un micro-framework web, qui gère l'authentification à l'aide de jetons. Ce cadre a besoin d'une fonction pour la fourniture de certains ID obtenu à partir du jeton et obtenir de l'utilisateur correspondant à cette ID.

Évidemment, le cadre ne sait rien sur les utilisateurs ou tout autre logique spécifique de l'application, de sorte que le code client doit injecter de l'utilisateur de lecture, des fonctionnalités dans le cadre de l'authentification de travail.

  • Pourquoi ne pas vous "fournir une interface pour être mis en œuvre et dans votre code cadre accepter une instance d'une classe qui implémente l'interface définie"? En Python vous voulez faire cela dans un l'aeap style (c-à supposer qu'il répond à cette interface, et un AttributeError ou TypeError obtient augmenté contraire), mais sinon, c'est la même chose.
  • Il est facile de le faire à l'aide abs's ABCMeta métaclasse avec @abstractmethod décorateur, et pas de manuel de validation. Veulent juste pour obtenir quelques options et suggestions. Celui que vous avez cité est la plus propre, mais je pense qu'avec plus de surcharge.
  • Alors je ne sais pas quelle question que vous essayez de le demander.
  • Ok, je vais essayer en d'autres termes. Le problème est clair. La question est de savoir comment le faire dans Pythonic façon. Option 1: Le chemin que vous avez cité, Option 2: L'approche de base que j'ai décrit dans la question. La question est donc, tout les autres Pythonic les moyens de le faire?
  • "Il devrait y avoir un, et de préférence seulement une façon évidente de le faire."
  • Merci, je le sais 🙂 mais ici, il y a évidemment plus de l'une des manières.
  • C'est évidemment très spécifique à l'application. Est-il une raison particulière pour laquelle, dans votre application, mafonction n'est pas enveloppé dans mysubclass? (Alors que vous n'avez pas besoin d'assigner dans __init__)
  • Merci pour le commentaire. J'ai mis à jour la question pour répondre à votre question.
  • Ici vous pouvez trouver un bon exemple: code.activestate.com/recipes/413268

InformationsquelleAutor bagrat | 2015-07-28