2010-05-09 5 views
0

décorateur 1:Python décorateur question

def dec(f): 
    def wrap(obj, *args, **kwargs): 
     f(obj, *args,**kwargs) 
    return wrap 

décorateur 2:

class dec: 
    def __init__(self, f): 
     self.f = f 
    def __call__(self, obj, *args, **kwargs): 
     self.f(obj, *args, **kwargs) 

Une classe d'échantillons,

class Test: 
    @dec 
    def disp(self, *args, **kwargs): 
     print(*args,**kwargs) 

Le code follwing travaille avec décorateur 1 mais pas avec décorateur 2.

a = Test() 
a.disp("Message") 

Je ne comprends pas pourquoi le décorateur 2 ne fonctionne pas ici. Quelqu'un peut il m'aider avec ça?

+0

Quelle partie ne fonctionne pas? –

+0

a = Test(); a.disp ("Message") n'a pas fonctionné avec le décorateur 2 – asdfg

Répondre

2

Lorsque vous décorez avec la classe dec, votre méthode disp n'est plus une méthode d'instance, mais une instance de la classe dec. Donc, a.disp est juste un simple membre de Test, qui se trouve être appelable parce qu'il a une méthode __call__, et dans le passé passé comme le premier argument de son instance f est "Message" (il n'est en aucun cas lié à l'instance "test").

avec la fonction décorateur:

a = Test() 
print a.disp 
# disp <bound method Test.wrap of <__main__.Test instance at 0xb739df0c>> 

avec la classe décorateur:

a = Test() 
print a.disp 
# disp <__main__.dec instance at 0xb739deec> 

modifier Cela devrait répondre à votre question beaucoup mieux et plus clair que moi:

http://irrepupavel.com/documents/python/instancemethod/

Questions connexes