Quelle est la meilleure façon de mettre en œuvre un crochet ou de rappel en Python?

J'aimerais fournir la capacité pour les utilisateurs d'un de mes modules pour étendre ses capacités en fournissant une interface pour appeler un utilisateur de la fonction. Par exemple, je veux donner aux utilisateurs la capacité d'être informé lorsqu'une instance d'une classe est créée, et la possibilité de modifier l'instance avant de l'utiliser.

La façon que j'ai mis en œuvre, il est de déclarer un module de niveau de la fonction de fabrication qui ne l'instanciation:

# in mymodule.py
def factory(cls, *args, **kwargs):
    return cls(*args, **kwargs)

Puis quand j'ai besoin d'une instance d'une classe dans mymodule, je ne factory(cls, arg1, arg2) plutôt que cls(arg1, arg2).

De l'étendre, un programmeur écrira dans un autre module de la fonction comme ceci:

def myFactory(cls, *args, **kwargs):
    instance = myFactory.chain(cls, *args, **kwargs)
    # do something with the instance here if desired
    return instance

Installation de la au-dessus de rappel ressemble à ceci:

myFactory.chain, mymodule.factory = mymodule.factory, myFactory

Cela semble assez simple pour moi, mais je me demandais si vous, en tant que programmeur Python, attendez une fonction pour enregistrer un rappel plutôt que de le faire avec une tâche, ou s'il existe d'autres méthodes que vous attendez. Ma solution semble réalisable, idiomatiques, et clair pour vous?

Je suis à la recherche de le garder aussi simple que possible; je ne pense pas que la plupart des applications va réellement besoin de la chaîne d'au moins un utilisateur de rappel, par exemple (même si illimité chaînage vient "gratuitement" avec le schéma ci-dessus). Je doute qu'ils vont avoir besoin de supprimer des rappels ou de définir les priorités ou de l'ordre. Des Modules comme python-rappels ou PyDispatcher semblent à moi comme overkill, en particulier le dernier, mais si il y a des avantages indiscutables pour un programmeur qui travaille avec mon module, je suis ouvert à eux.

  • Quel est le problème avec l'aide d'un simple sous-classe pour étendre une classe? Pourquoi toute cette confusion, les appels d'affaires?
InformationsquelleAutor kindall | 2010-11-30