Python のクリーン トリーについて質問があります。いつ:
@decorator_func
def func(bla, alba):
pass
以下と同等です。
def func(bla, alba):
pass
func = decorator_func(func)
そう:
@decorator_func(aaa, bar)
def func(bla, alba):
pass
に相当しますか?
それは以下と同等です:
def func(bla, alba):
pass
func = decorator_func(aaa, bar)(func)
または:
def func(bla, alba):
pass
decorator = decorator_func(aaa, bar)
func = decorator(func)
したがって、2 番目の例でdecorator_func
は、callable を返す callable にする必要があります。
このような構造の例を次に示します。
class prepend_two_arguments:
def __init__(self, a, b):
self.a = a
self.b = b
def __call__(self, f):
def wrapped_function(*args, **kwargs):
return f(self.a, self.b, *args, **kwargs)
return wrapped_function
@prepend_two_arguments(1,2)
def f(a, b, c):
return a+b+c
print(f(3)) # 6
そして、関数のみを使用する別のもの:
def add_to_result(x):
def decorator(fn):
def wrapped_function(*args, **kwargs):
return fn(*args, **kwargs)+x
return wrapped_function
return decorator
@add_to_result(3)
def my_func(a, b):
return a+b
print(my_func(1,2)) # 6
クロージャーを使用して機能するデコレーター関数の例を次に示します。
def print_string_before(string):
def decorator_fn(fn):
def wrapped_fn(*args, **kwargs):
print string
return fn(*args, **kwargs)
return wrapped_fn
return decorator_fn
デコレーターは、装飾された関数 (またはクラス) を何らかの方法 (属性の設定など) で変更して、同様に返すことができることに注意してください。