4

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

に相当しますか?

4

2 に答える 2

8

それは以下と同等です:

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
于 2012-06-18T09:07:31.780 に答える
1

クロージャーを使用して機能するデコレーター関数の例を次に示します。

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

デコレーターは、装飾された関数 (またはクラス) を何らかの方法 (属性の設定など) で変更して、同様に返すことができることに注意してください。

于 2012-06-18T09:27:19.953 に答える