装饰器
官方定义:返回值为另一个函数的函数,通常使用 @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 参数。