2016-07-12 4 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()はクラス内で定義された関数です。誰かがどこ見つけるために私を助けてください、私はエラー

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

を取得しています

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()) 

:今、上記のコードは次のようになります私は間違っている。

ありがとうございます。

答えて

1

fooの引数は関数でなければなりません。 dispはインスタンスメソッドであり、唯一のインスタンスの上で呼び出すことができますので、このコード

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

は、

x = with_class.decorate.disp() 
with_class.foo(x) 
あなたが with_class.decorate.disp()を呼び出すときにエラーが最初の行で発生し

の、完全に同等ですdecoratedispに電話する必要はありません。引数として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

'decorate'をwith_classという名前の別のファイルで定義すると、それを' with_class.decorate'として参照するか、 'from_class import decorate'を実行する必要があります。これはPythonがどのように動作するのか、特にデコレータには関係しません。 –

関連する問題