2017-09-11 26 views
0

私はpythonのデコレータを読んでいると非常に便利だが、私はGoogleとstackoverflowで検索しようとしたが、良い答えを見つけることができませんでした混乱している1つの質問はすでに同じタイトルでstackoverflowで聞かれている@wrap、私の質問は異なります。デコレータでラッパーを使用する理由、ラッパーなしでデコレータを作成できるのはなぜですか?

だから何である基本的なデコレータテンプレートは次のとおりです。結果

def deco(x): 
    def wrapper(xx): 
     print("before the deco") 
     x(xx) 
     print("after the deco") 
    return wrapper 


def new_func(a): 
    print("this is new function") 

wow=deco(new_func) 
print(wow(12)) 

before the deco 
this is new function 
after the deco 
None 

だからいつでもデコはそれがWRA呼んで返しますpper関数、今私が得意でないのは、デコ関数にパラメータとしてnew_funcを渡し、デコ関数でそのパラメータを呼び出すという主な目的があるときにラッパーを使用する理由です。 :結果

def deco(x): 
    print("before the deco") 
    a=1 
    x(a) 
    print("after the deco") 




def new_func(r): 
    print("this is new function") 


wow=deco(new_func) 
print(wow) 

before the deco 
this is new function 
after the deco 
None 

だからデコレータでラッパーを使用することは何ですか?

+0

'print(wow(12))'と 'print(wow)'には違いがあります。後者の場合、関数を返さないことさえあります。 –

+0

違いがあります。最初の方法は関数を返すことであり、2番目の方法は何も返さないことです。両方の呼び出しの後に 'print(type(wow))'を追加すれば、それを見ることができます。 – PerunSS

答えて

0

ここでは役立つ質問があります。 new_funcを変更して、 が実際に渡されたパラメータを使用するようにしましょう。例えば

def new_func(r): 
    print("new_func r:", r) 

我々はnew_funcにパラメータを渡すanother_func持ってもとします

def another_func(): 
    new_func(999) 

質問をあなたのために

  • another_funcがなくても動作し続けるようにあなたがdecoを書くことができるか、です任意の変更および
  • new_funcはどんな値iそれに渡されるanother_func

関連する問題