私はデコレータについて学んでいます。質問があります。このデコレータ関数call_counter
では、別の関数が定義されて返され、関数func
がデコレータ関数のパラメータとして渡されます。これが完了するとPythonクロージャ:関数内で定義された関数は、1レベル上の変数にアクセスできますか?
def call_counter(func):
def helper(*args, **kwargs):
helper.calls += 1
return func(*args, **kwargs)
helper.calls = 0
return helper
、私たちは、このように任意の関数の外からhelper.calls
にアクセスすることができます。
@call_counter
def addition(x, y):
return x + y
print(addition.calls)
addition(1, 2)
print(addition.calls)
出力:
私の質問がある0
1
、どのようにすることができますhelper.calls
変数をcall_counter
関数が呼び出されて終了した後にメモリに存在しますか?私が理解する限り、のメモリにはhelper.calls
が存在します。しかし、call_counter
の実行が終了した後に変数にアクセスできるかどうかはわかりません。
'calls'は' call_counter'ではなく 'helper'に関連しています。 –
'.calls'は単に' call_counter'によって返された新しい 'helper'関数オブジェクトの属性です。実際のクロージャ「マジック」は、新しい 'addition'関数が' func'引数として 'call_counter'に渡された' addition'の元のバージョンを呼び出すことができるということです。 –