Bonjour,

j'aimerais savoir s'il est possible d'utiliser une méthode pour décorer une autre méthode.
Voici un bout de code (d'exemple, mon vrai code est + compliqué) pour éclaircir mon truc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Spam :
 
    def __init__(self,verbose):
        self.verbose = verbose
        self.name = 'Spam'    
 
    def deco ( self,func ):
        if self.verbose: # NB j'accède au self de l'instance
            def sub ( *k,**a ):
                print 'entering',self.name
                return func( *k,**a )  # execute la methode
        else:
            def sub ( *k,**a ):
                return func( *k,**a )  # execute la methode
        return sub
 
    @deco
    def eggs (self,x):
        return x+1
 
s = Spam(True)
x = s.eggs(5)
Voici le code que j'imagine pour mon cas, mais ça ne compile pas : "deco() takes exactly 2 arguments (1 given)"

J'ai essayé toutes sortes de solutions de contournement, mais rien ne passe...
(déclarer deco en @staticmethod, décorer eggs avec @self.deco, etc.)

Bien sûr, je pourrais déclarer deco comme une fonction en dehors de Spam, mais ce serait moche car le code de deco est très lié à la classe Spam (ici, j'ai mis un code rikiki pour l'exemple)...

Attention : ce bout de code est là pour l'exemple... le but n'est pas de trouver comment faire marcher cet exemple, mais de trouver comment accéder au self de l'instance dans le décorateur.

Si quelqu'un a une idée...
merci d'avance !