2016-07-27 8 views
1

私はPythonデコレータを理解しようとしています。私はこのコードを書くまで、何とか私がデコレータを理解したと思った。Pythonデコレータはどのようにこのコードで動作しますか?

def func(): 
    def wrapper(x): 
     return x() 
    return wrapper 

@func() 
def b(): 
    return sum 

a = b([1,2,5]) 
print a # Result: 8 How? 

e = b # pass b function to variable e 
f = e([3,4,8]) # called function b stored in variable e 
print f # Result: 15 
# I understand how 15 is derived here 
+0

私はグーグルがそれに最善の答えを与えると思います。 https://realpython.com/blog/python/primer-on-python-decorators/ –

答えて

2

あなたは装飾結果を生成するためにb()と呼ばれることデコレータを作成するデコレータ工場、としてfuncを使用。ここでは何が起こるかです:

  • @func()最初func()を実行し、その後、デコレータとして戻り値を使用しています。 func()wrapperを返すので、wrapperがデコレータとして使用されます。
  • wrapper(b)x = bを設定し、x()を返します。したがって、デコレータの結果はb()です。これはsumです。 Pythonセットb = sum
  • b([1, 2, 5])b = sumと呼ばれます。したがってsum([1, 2, 5])が返されます。

ここで重要な部分は、あなたがいないデコレータとしてfuncを使用していることですが、デコレータ工場として間接の層を追加し、(それが実際のデコレータを生成呼び出し)。

関連する問題