2016-07-12 144 views
0

需要幫助。傳遞裝飾器的功能

有一個文件with_class.py來保存類的裝飾器的實現。該函數正在從另一個文件use_class.py中調用。

with_class.py

def __init__(self,f): 
    self.f = f 
def __call__(self,x): 
    self.f(x) 

@decorate 
def foo(x): 
    print "inside foo" , x 

use_class.py

import with_class 
a = with_class.foo(x) 

它工作正常。 現在,如果我想傳遞一個函數來代替x。 我有在with_class.py和use_class.py中定義的函數,我想傳遞給「a = with_class.foo(with_class.decorate.disp())」。 disp()是在類中定義的函數。現在上面的代碼看起來像:

with_class.py

class decorate: 
     def __init__(self,f): 
      self.f = f 
     def __call__(self,g): 
      self.f(g) 

     def disp(self): 
      print "inside the display" 

@decorate 
def foo(fn): 
    print "inside foo" 
    fn() 

use_class.py

import with_class 
a = with_class.foo(with_class.decorate.disp()) 

我收到錯誤

"**TypeError: unbound method disp() must be called with decorate instance as first argument**". 

是否有人可以幫助我找到哪裏我錯了。

在此先感謝。

回答

1

foo的參數必須是一個函數。此代碼

with_class.foo(with_class.decorate.disp()) 

x = with_class.decorate.disp() 
with_class.foo(x) 

當你調用with_class.decorate.disp()在第一行發生錯誤的完全等效,因爲disp是一個實例方法,只能在一個實例稱爲decorate。你不想撥打disp;你想把它作爲參數傳遞給foo。事情是這樣的:

class decorate: 
    def __init__(self,f): 
     print("decorate constructor") 
     self.f = f 
    def __call__(self,g): 
     print("Call", g) 
     self.f(g) 
     print("Call ended") 
    @staticmethod 
    def disp(): 
     print("inside the display") 

@decorate 
def foo(fn): 
    print("inside foo") 
    fn() 

print("About to foo") 
foo(decorate.disp)  

運行這個(Python3)給出:

decorate constructor 
About to foo 
Call <function decorate.disp at 0x02A2D108> 
inside foo 
inside the display 
Call ended 
+0

...我如上試圖與代碼和它工作得很好。但我嘗試使用另一個文件「use_class.py」,其中:import with_class –

+0

import with_class with_class.foo(decorate.disp)它失敗,錯誤...... NameError:name'decorate'未定義。 –

+0

如果您在另一個名爲with_class的文件中定義了'decorate',那麼您需要將其引用爲'with_class.decorate',否則請執行'from_class import decorate'。這就是Python的工作原理,與裝飾器沒有特別的關係。 –