views:

130

answers:

1

decorator 1:

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

decorator 2:

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

A sample class,

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

The follwing code works with decorator 1 but not with decorator 2.

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

I dont understand why decorator 2 is not working here. Can someone help me with this?

+1  A: 

When you decorate with the dec class, your disp method is no more an instance method, but an instance of class dec. So a.disp is just a plain member of Test, which happens to be callable because it has a __call__ method, and in the self passed as the first argument of its f instance is "Message" (it is by no way bound to the "test" instance).

with the decorator function:

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

with the decorator class:

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

edit That should answer your question far better and clearer than I did:

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

LeMiz