python装饰器可以理解为函数作为另外函数的参数
这是函数式编程的特征
举个例子:
def star(func): print("star") def inner(*args, **kwargs): print("*" * 30) func(*args, **kwargs) print("*" * 15) return inner def percent(func): print("percent") def inner(*args, **kwargs): print("%" * 30) func(*args, **kwargs) print("%" * 15) return inner @star @percent def printer(msg,msg2): print(msg,msg2) printer("Hello","World")
percent star ****************************** %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Hello World %%%%%%%%%%%%%%% ***************
从上面的执行过程可以看出,函数调用过程
@star @percent def printer(msg,msg2): print(msg,msg2)
相当于
def printer(msg): print(msg) printer = star(percent(printer))
如果调整装饰器位置,执行顺序也会相应改变
@percent @star def printer(msg,msg2): print(msg,msg2) printer("Hello","World")
star percent %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ****************************** Hello World *************** %%%%%%%%%%%%%%%