学习博客: Python 函数装饰器 | 菜鸟教程 (runoob.com)
直观上对装饰器的理解:
一切皆对象,函数可以作为参数传入另一个函数,函数也可作为返回值返回
装饰器能获取到添加装饰器的函数的函数名和参数,然后在装饰函数里可以调用被装饰的函数,也可以添加一些定制的代码
示例:-
用函数调用来达到装饰器的效果
def decorate_add(f): def de_add(*args): print("求和函数即将执行!") f(args[0], args[1]) print("求和函数执行完成!") return de_add def add_integer(a, b): sum = a + b print("求和结果:", sum) add_0 = decorate_add(add_integer) # 函数名add_integer作为参数传入了decorate_add函数 # decorate_add函数的返回值de_add是一个函数名 add_0(2, 3) # 运行结果 求和函数即将执行! 求和结果: 5 求和函数执行完成! -
使用装饰器来修改上个例子
from functools import wraps def decorate_add(f): @wraps(f) # @wraps保护被装饰的函数f的属性不被装饰器修改 def de_add(*args): print("求和函数即将执行!") f(args[0], args[1]) print("求和函数执行完成!") return de_add @decorate_add def add_integer(a, b): sum = a + b print("求和结果:", sum) add_integer(2, 3) # 运行结果 求和函数即将执行! 求和结果: 5 求和函数执行完成! -
带参数的装饰器(函数调用)
def decorate_add(c=5): def de_add_integer(func): def de_add(*args): print("求和函数即将执行!") func(args[0], args[1]) print("求和函数执行完成!") print("额外的变量值为:", c) return de_add return de_add_integer def add_integer(a, b): sum = a + b print("求和结果:", sum) de_add0 = decorate_add() de_add1 = de_add0(add_integer) de_add1(2, 3) # 运行结果 求和函数即将执行! 求和结果: 5 求和函数执行完成! 额外的变量值为: 5 -
带参数的装饰器(使用@)
from functools import wraps def decorate_add(c=5): def de_add_integer(func): @wraps(func) def de_add(*args): print("求和函数即将执行!") func(args[0], args[1]) print("求和函数执行完成!") print("额外的变量值为:", c) return de_add return de_add_integer @decorate_add(7) def add_integer(a, b): sum = a + b print("求和结果:", sum) add_integer(2, 3) # 输出结果 求和函数即将执行! 求和结果: 5 求和函数执行完成! 额外的变量值为: 7
拓展:
装饰器利用闭包原理,只是装饰器在闭包中传入的参数是函数
内容如有错误,敬请指正!



