Skip to content

装饰器

官方定义:返回值为另一个函数的函数,通常使用 @wrapper 语法形式来进行函数变换。

使用 @xxx 其实是 m2 = xxx(m1) 的语法🍬格式。

示例

python
import functools


def decorator(func):

    print("decorator")

    @functools.wraps(func) # 使得原函数的属性不会被覆盖,如 __name__
    def wrapper(*args, **kwargs):
        print("wrapper")
        # 这里的 args 和 kwargs 就是实际调用被装饰函数的参数
        return func(*args, **kwargs)

    return wrapper

@decorator
def test1():
    print("test1")

test2 = decorator(lambda : print("test2"))

test1()
test2()

上面的输出顺序是 decorator 、decorator 、wrapper 、test1 、wrapper 、test2

带参数的装饰器

带参数的装饰器就是在外面在加上一层包装,这个包装接收其它参数

示例

python
import functolls 


def replay(num):
    def decorator(func):
        print("decorator")

        @functools.wraps(func)  # 使得原函数的属性不会被覆盖,如 __name__
        def wrapper(*args, **kwargs):
            print("wrapper", func.__name__)
            for i in range(num):
                func(*args, **kwargs)

        return wrapper

    return decorator


@replay(5)
def test1():
    print("test1")


test2 = replay(5)(lambda: print("test2"))

test1()
test2()

类装饰器

类装饰器的函数接收一个 cls 参数。