2016-07-06 13 views
0

デコレータに関する質問があります。私は、pythonでデコレータのコンセプトを理解しようとしていますが、クラスでデコレータを使用することに固執しています。Pythonのオブジェクト指向プログラムでデコレータを実装する方法

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

     def __call__(self) 
      self.f() 
@decorate 
def foo(): 
    print "inside foo" 
foo() 

with_class.py は、私は、単一の.pyファイル内全体のコードを配置し、期待どおりに実行しました。 OUTPUT:inside foo

しかし、クラスのオブジェクトを別の.pyファイルにデコレートして、同じ出力を取得しようとしました。 最初の.pyファイルにfoo()をコメントし、次のコードを2番目の.pyファイルで使用しました。

use_class.py

import with_class 
a = with_class.decorate() 

しかし、それは誤りTypeError: __init__ takes exactly 2 arguments(1 given)を投げています。 __init__を呼び出す間に2つの引数を指定する必要があります。 use_class.pyでメソッドfooを実行するために何を渡すのが得られません。 もう一度、__call__(self,f)をからfを削除して使用しようとしましたが、エラーも発生します。 私はコンセプトを得ていないようです。何

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

+0

あなたが関数として 'decorate'を書いていたら、あなたはそれを渡しましたか?その引数を渡してください。 – user2357112

+0

なぜあなたは '飾る 'と呼んでいますか?あなたは 'with_class.foo()'を呼び出すべきです。 – Bakuriu

+0

デコレートがクラスです。 –

答えて

2

だからfooが飾ら機能(実際にクラスdecorate、のオブジェクトが)with_classモジュールにバインドされている名前である

def foo(): 
    print "inside foo" 

foo = decorate(foo) 

に相当します。 use_class.pyから、あなたはそうするべきです

import with_class 

a = with_class.foo() 
+0

上記の装飾された関数にパラメータを渡したい場合、:: a = with_class.foo(x)のようにして、with_class.pyクラスを修飾します。 def __init __(self、f): self.f = F デフ__call __(自己、x)は self.f(x)の @decorate デフfooの(X):私は、xの代わりに関数を渡す場合は、 "fooの内部" プリントは、今 –

+0

をxは。 functinは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):ディスプレイ内に "@Decorate def foo(fn): " foo "内のprint fn() –

関連する問題