Python ajouter à une fonction dynamiquement
comment puis-je ajouter le code d'une fonction existante, que ce soit avant ou après?
par exemple, j'ai une classe:
class A(object):
def test(self):
print "here"
comment puis-je modifier la classe de l'esprit métaprogrammation, de sorte que je ne présente
class A(object):
def test(self):
print "here"
print "and here"
peut-être d'une certaine façon à l'ajout d'une fonction pour tester?
ajouter une autre fonction telle que
def test2(self):
print "and here"
et de modifier l'original à
class A(object):
def test(self):
print "here"
self.test2()
est-il un moyen de faire cela?
InformationsquelleAutor Timmy | 2010-05-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un décorateur pour modifier la fonction, si vous le souhaitez. Cependant, puisqu'il n'est pas un décorateur appliqués au moment de la définition initiale de la fonction, vous ne serez pas en mesure d'utiliser le
@
sucre syntaxique pour l'appliquer.Ne remarque qu'il va modifier la méthode pour les instances existantes ainsi.
MODIFIER: modification de l'args liste dans le décorateur à la mieux version à l'aide de
args
etkwargs
Typique de la façon d'ajouter des fonctionnalités à une fonction est d'utiliser un décorateur (à l'aide de l'enveloppe de la fonction):
Bien sûr, cela dépend vraiment de ce que vous essayez d'accomplir. J'utilise les décorateurs beaucoup, mais si tout ce que je voulais faire était d'impression de messages supplémentaires, je serais probablement faire quelque chose comme
Il ne faut pas de méta-programmation, mais votre exemple est probablement grandement simplifiée de ce que vous avez réellement besoin de le faire. Peut-être que si vous publiez plus de détails sur vos besoins spécifiques, nous pouvons conseiller à ce que le Pythonic approche serait.
EDIT: Puisqu'il semble que vous voulez appeler des fonctions, vous pouvez avoir une liste de fonctions au lieu d'une liste de messages. Par exemple:
Noter que si vous souhaitez ajouter des fonctions qui seront appelées par toutes les instances de
A
, alors vous devriez fairefuncs
un champ de classe plutôt que d'un champ d'instance, par exempleIl y a beaucoup de très bonnes suggestions ci-dessus, mais je n'ai pas vu de passage d'une fonction à l'appel. Pourrait ressembler à quelque chose comme ceci:
En utilisant ceci:
Cette réponse permet de modifier la fonction d'origine sans créer un wrapper. J'ai trouvé les deux natifs python types, qui sont utiles pour répondre à votre question:
Et
Ce Code semble faire la job:
Pourquoi ne pas utiliser l'héritage?
Copier et coller, profitez-en!!!!!
Si votre classe A hérite de l'objet, vous pourriez faire quelque chose comme:
Ce code n'a aucun intérêt et que vous ne pouvez pas utiliser l'auto dans votre nouvelle méthode que vous avez ajouté.
Je viens de trouver ce code de plaisir, mais je ne vais jamais utiliser cela. Je n'aime pas dynamicaly changement de l'objet lui-même.
C'est le moyen le plus rapide et plus compréhensible.