以下のデコレータデモンストレーションコードがあります。明示的にgreet
関数を呼び出さずに実行すると、print
文がデコレータ関数内で実行され、Inside decorator
が出力されます。Pythonデコレータ関数の実行
私はこのデコレータの動作を理解できません。 greet
を呼び出さなくても、time_decorator
がどのように呼び出されますか?私は、Python 3を使用しています
def time_decorator(original_func):
print('Inside decorator')
def wrapper(*args, **kwargs):
start = time.clock()
result = original_func(*args, **kwargs)
end = time.clock()
print('{0} is executed in {1}'.format(original_func.__name__, end-start))
return result
return wrapper
@time_decorator
def greet(name):
return 'Hello {0}'.format(name)
ありがとう@Apero!コンパイル時にデコレータを呼び出す背景には何がありますか?デコレータとは別に、コンパイル時に呼び出されるオブジェクトはありますか? –
はい、メタクラスは、実行時ではなく、コンパイル時に「メタクラス化」するクラスも変更します。メタクラスやデコレータは、初期コード自体を変更することなく、それぞれメタクラスやデコレートするコードを変更するため、コードハッキングのように見えます。この「今すぐコード」が呼び出されるたびに、新しいハッキングされた動作が発生します。 –
私は「コンパイル時」と言っているのはむしろ誤解を招くと思います。 Pythonの関数(およびクラス)定義は、実行時(例えば、プログラムを起動するとき)にインタプリタによって実行されるステートメントによって作成されます。Pythonコード(ソースコードからバイトコードに変換される)にはコンパイルのステップが含まれていますが、これは 'def'のようなステートメントの実行とは関係ありません。 – Blckknght