La mise en œuvre du décorateur modèle en Python

Je veux mettre en œuvre les décorateur modèle en Python, et je me demandais si il y a une façon d'écrire un décorateur qui vient de implémente la fonction qu'il souhaite modifier, sans avoir à écrire de la chaudière-plaque pour toutes les fonctions qui sont simplement transmis à l'objet décoré. Comme:

class foo(object):
    def f1(self):
        print "original f1"
    def f2(self):
        print "original f2"

class foo_decorator(object):
    def __init__(self, decoratee):
        self._decoratee = decoratee
    def f1(self):
        print "decorated f1"
        self._decoratee.f1()
    def f2(self):              # I would like to leave that part out
        self._decoratee.f2()

Je voudrais avoir des appels à foo_decorator.f2 transmis à decoratee.f2 automatiquement. Est-il possible d'écrire une méthode générique qui transfère toutes les mises au placard de la fonction-les appels à decoratee?

  • Pouvez-vous donner un exemple où tout simplement sous-classement, pas de travail? Vous pouvez sous-classe dynamiquement trop - ce modèle semble comme une solution de contournement pour les langues qui ne peuvent pas le faire ou ne prennent pas en charge plusieurs part de l'héritage.
  • Je veux décorer des objets lors de l'exécution. Je veux appliquer différents décorateurs d'un objet et d'être en mesure de les supprimer. Sous-classement ne peut pas changer l'instance après qu'il a été créé, ou peut-il?
  • Si vous avez de la classe A et changement A, c'est à dire l'ajout d'une nouvelle méthode, A.foo = lambda self: self cela vous permettra de réfléchir sur toutes les instances d'Un .. parce que tout est déterminé au moment de l'exécution. Excellente façon de produire absolument difficile à maintenir le code.
  • Le décorateur modèle (contrairement à python décorateurs) est utilisé pour ajouter un comportement à un objet lors de l'exécution. C'est en fait très facile à gérer, quand il est fait correctement, c'est pourquoi j'ai posté cette question. Je voulais trouver le moyen de cette en Python.