Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python装饰器理论_Python_Decorator_Theory - Fatal编程技术网

Python装饰器理论

Python装饰器理论,python,decorator,theory,Python,Decorator,Theory,我对Python中的干净理论有疑问。当: @decorator_func def func(bla, alba): pass 相当于: def func(bla, alba): pass func = decorator_func(func) def func(bla, alba): pass func = decorator_func(aaa, bar)(func) 因此: 等于…?等于: def func(bla, alba): pass func =

我对Python中的干净理论有疑问。当:

@decorator_func
def func(bla, alba):
    pass
相当于:

def func(bla, alba):
    pass
func = decorator_func(func)
def func(bla, alba):
    pass
func = decorator_func(aaa, bar)(func)
因此:

等于…?

等于:

def func(bla, alba):
    pass
func = decorator_func(func)
def func(bla, alba):
    pass
func = decorator_func(aaa, bar)(func)
或:

因此,在第二个示例中,
decorator_func
应该是一个可调用函数,返回一个可调用函数

以下是此类构造的一个示例:

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

下面是一个使用闭包的decorator函数示例:

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
请注意,在以某种方式(例如,设置属性)修改后,修饰符同样可以返回修饰的函数(或类)