参考博客: https://www.cnblogs.com/Lin-Yi/p/7306235.html
函数装饰器用于在源码中标记函数, 以某种方式增强函数的行为。 装饰器会在加载模块时直接运行。
装饰器是可调用的对象, 其参数是被装饰的函数。 但装饰器通常会把函数替换位另一个函数
实现一个简单的装饰器:
def decorate(func): def inner(): print("我是装饰器") func() return inner @decorate def func(): pass func() print(func)
我是装饰器
<function decorate.<locals>.inner at 0x000002B0C71D5378>闭包是指延申了作用域的函数。
自由变量(free variable) 指未在本地作用域中绑定的变量 python中使用nonlocal来标记自由变量
如果被装饰的函数带参数:
def decorate(func): def inner(*args): print("开始装饰") func(*args) print("装饰结束") return inner@decoratedef func(*args): print(*args)func(1, 2) # 由于装饰器会把被装饰的函数替换为另一个函数,这里是inner,所以在定义inner函数时接收参受开始装饰1 2装饰结束
如果目标函数需要多层装饰:
def decorate1(func): def inner(*args, **kwargs): print("装饰器1开始装饰") func(*args, **kwargs) print("装饰器1装饰结束") return innerdef decorate2(func): def inner(*args, **kwargs): print("装饰器2开始装饰") func(*args, **kwargs) print("装饰器2装饰结束") return inner @decorate1 # 相当于 func = decorate1(decorate2(func)) 先执行decrate1() 函数 decorate1函数中的func执行也就是 decorate2(func)开始执行。 @decorate2def func(*args): print(*args)func(1, 2) 装饰器1开始装饰装饰器2开始装饰1 2装饰器2装饰结束装饰器1装饰结束
可选择装饰器, 需要三层闭包嵌套:
def flagoperation(flag): def decorate(func): def inner(*args, **kwargs): print("装饰器开始装饰") func(*args, **kwargs) if flag == True: print("我是后置操作") print("装饰器装饰结束") return inner return decorate@flagoperation(True) # 相当于 decorate(func) 带着一个参数 True 带着True参数再对目标函数进行装饰def func(*args): print(*args)func(1, 2)装饰器开始装饰1 2我是后置操作装饰器装饰结束