Je voudrais offrir aux utilisateurs de l'un de mes modules la possibilité d'étendre ses capacités en fournissant une interface pour appeler la fonction d'un utilisateur. Par exemple, je souhaite donner aux utilisateurs la possibilité d'être averti lorsqu'une instance d'une classe est créée et qu'elle a la possibilité de modifier l'instance avant qu'elle ne soit utilisée.Quelle est la meilleure façon d'implémenter un hook ou un callback en Python?
La façon dont je l'ai mis en œuvre, il est de déclarer une fonction d'usine au niveau du module qui fait l'instanciation:
# in mymodule.py
def factory(cls, *args, **kwargs):
return cls(*args, **kwargs)
Puis, quand je besoin d'une instance d'une classe dans mymodule, je factory(cls, arg1, arg2)
plutôt que cls(arg1, arg2)
.
Pour l'étendre, un programmeur écrire dans un autre module 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 du rappel ci-dessus ressemble à ceci:
myFactory.chain, mymodule.factory = mymodule.factory, myFactory
Cela me semble assez simple à, mais je me demandais si vous, en tant que programmeur Python, vous attendez à une fonction pour enregistrer un rappel plutôt que de le faire avec une affectation, ou s'il y avait d'autres méthodes que vous attendez. Est-ce que ma solution semble réalisable, idiomatique et claire pour vous? Je cherche à le garder aussi simple que possible; Je ne pense pas que la plupart des applications auront besoin de chaîner plus d'un rappel d'utilisateur, par exemple (bien que le chaînage illimité soit "gratuit" avec le modèle ci-dessus). Je doute qu'ils devront supprimer les rappels ou spécifier les priorités ou l'ordre. Des modules tels que python-callbacks ou PyDispatcher me semblent être exagérés, surtout ceux-ci, mais s'il y a des avantages convaincants pour un programmeur travaillant avec mon module, je suis ouvert à eux.
Quel est le problème avec l'utilisation d'une sous-classe simple pour étendre une classe? Pourquoi toute cette confusion appelle-t-elle les affaires? –