2010-05-09 88 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

哪部分不起作用? – 2010-05-09 08:38:36

+0

a = Test(); a.disp(「Message」)不能與裝飾器2一起使用 – asdfg 2010-05-09 08:51:17

回答

2

當您使用dec類進行裝飾時,您的disp方法不再是實例方法,而是類dec的實例。所以a.disp只是Test的一個普通成員,它恰好可以被調用,因爲它有一個__call__方法,並且在作爲它的f實例的第一個參數的自傳中是"Message"(它決不會綁定到「測試」實例)。

與裝飾功能:

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/