Python装饰理论

Rad*_*nik 4 python theory decorator

我对Python中的干净thory有疑问.什么时候:

@decorator_func
def func(bla, alba):
    pass
Run Code Online (Sandbox Code Playgroud)

相当于:

def func(bla, alba):
    pass
func = decorator_func(func)
Run Code Online (Sandbox Code Playgroud)

所以:

@decorator_func(aaa, bar)
def func(bla, alba):
    pass
Run Code Online (Sandbox Code Playgroud)

等于...?

Ole*_*pin 8

它相当于:

def func(bla, alba):
    pass
func = decorator_func(aaa, bar)(func)
Run Code Online (Sandbox Code Playgroud)

要么:

def func(bla, alba):
    pass
decorator = decorator_func(aaa, bar)
func = decorator(func)
Run Code Online (Sandbox Code Playgroud)

所以在你的第二个例子中,decorator_func应该是一个返回可调用的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
Run Code Online (Sandbox Code Playgroud)

另一个,只使用功能:

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
Run Code Online (Sandbox Code Playgroud)