Python décorateurs dans les classes
Peut-on écrire quelque chose comme:
class Test(object):
def _decorator(self, foo):
foo()
@self._decorator
def bar(self):
pass
D'échec: l'auto dans @auto est inconnu
J'ai aussi essayé:
@Test._decorator(self)
qui échoue également: Test de l'inconnu
Je voudrais changer temporairement certaines variables d'instance
dans le décorateur, puis exécutez le décoré de la méthode, avant de
changer l'arrière.
Vous devez vous connecter pour publier un commentaire.
Serait quelque chose comme cela de faire ce dont vous avez besoin?
Cela évite l'appel à l'autonomie pour accéder à la décoratrice et laisse cachés dans la classe de l'espace de noms que d'une méthode régulière.
modifiés pour répondre à la question dans les commentaires:
Comment utiliser le caché décorateur dans une autre classe
De sortie:
Ce que vous êtes désireux de le faire n'est pas possible. Prenez, par exemple, de savoir si ou non le code ci-dessous est valide:
Bien sûr, n'est pas valide, car
self
n'est pas défini à ce stade. Il en va de même pourTest
que ce ne sera pas défini jusqu'à ce que la classe elle-même est définie (ce qui son dans le processus d'). Je vous montre cet extrait de code, parce que c'est ce que votre décorateur d'extrait de transforme en.Donc, comme vous pouvez le voir, l'accès à l'instance dans un décorateur, comme ce n'est pas vraiment possible, car les décorateurs sont appliquées lors de la définition de ce que la fonction/méthode qu'ils y sont attachés, et non lors de l'instanciation.
Si vous avez besoin d' de classe-niveau d'accès, essayez ceci:
C'est un chemin que je connais (et utilisé) pour accéder à
self
de l'intérieur d'un décorateur définie à l'intérieur de la même classe:De sortie (testé sur python 2.7.10):
L'exemple ci-dessus est idiot, mais montre qu'il fonctionne.
- Je utiliser ce type de décorateur dans un peu de débogage situations, il permet primordial des propriétés de la classe par la décoration, sans avoir à trouver la fonction appelante.
Voici le décorateur code
Remarque: parce que j'ai utilisé une classe décorateur, vous aurez besoin d'utiliser @adecorator() avec les supports pour décorer les fonctions, même si vous ne passez pas tous les arguments pour le décorateur le constructeur de la classe.
J'ai trouvé cette question alors que des recherches sur un problème très similaire. Ma solution est de diviser le problème en deux parties. Tout d'abord, vous avez besoin pour capturer les données que vous souhaitez associer avec les méthodes de la classe. Dans ce cas, handler_for va associer une commande Unix avec le gestionnaire pour que la sortie de la commande.
Maintenant que nous avons associé des données avec chaque méthode de la classe, nous avons besoin de recueillir des données et de les stocker dans un attribut de classe.
Décorateurs semblent mieux adaptés à modifier les fonctionnalités d'un ensemble de l'objet (y compris les objets de fonction) par rapport à la fonctionnalité d'un méthode de l'objet qui, en général, dépend de l'instance attributs. Par exemple:
La sortie est:
Voici une expansion sur Michael Speer, en réponse à la prendre un peu plus loin:
Une méthode d'instance décorateur qui prend des arguments et des actes sur une fonction avec des arguments et une valeur de retour.
Et puis
Vous pouvez décorer le décorateur:
J'ai une mise en Œuvre de Décorateurs qui Pourrait l'Aider à