2010-05-09 3 views
0

декоратор 1:Python декоратор вопрос

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

декоратор 2:

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

Класс образец,

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

follwing код работает с декоратором 1, но не с декоратором 2.

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

Я не понимаю, почему декоратор 2 здесь не работает. Может кто-то помочь мне с этим?

+0

Какая часть не работает? –

+0

a = Test(); a.disp («Сообщение») не работал с декоратором 2 – asdfg

ответ

2

Когда вы украшаете класс dec, ваш метод disp больше не является методом экземпляра, а экземпляром класса dec. Таким образом, a.disp - это простой член Test, который, как оказалось, может быть вызван, потому что он имеет метод __call__, а в self передается как первый аргумент своего экземпляра f: "Message" (он никоим образом не связан с экземпляром «test»).

с функцией декоратора:

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

с классом декоратора:

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

редактировать Это должно ответить на ваш вопрос гораздо лучше и яснее, чем я:

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