Python 中函数和普通变量完全等价:
- 可以赋值给变量 :
a = print→a("hello")等价于print("hello") - 可以作为参数传递
- 可以作为返回值
- 可以嵌套定义:在函数内部再定义函数
这是装饰器能发挥作用的根本前提。
@装饰器就是一个语法糖,本质 上就是接收一个函数作为参数,并且返回一个新函数的高阶函数,从而实现不修改原函数,却给函数加新功能。
装饰器函数的逻辑流程
- 接收旧函数:装饰器作为高阶函数,接收被装饰的原函数
- **内部创建一个包装函数:**在装饰器内部定义一个包装函数,新增想要实现的函数功能
- 再在包装函数里面调用旧函数:对旧函数进行装饰
- 返回装饰后的新函数:替换原函数(新旧函数名不变)
这就是装饰器的灵魂设计
例子:
语法糖写法(优雅)
@my_decorator
def func():
pass
完全等价的原生写法(啰嗦)
func = my_decorator(func)
- 执行时机:函数定义时,Python 解释器自动执行转换,不是函数调用时
- 本质:把原函数
func传给my_decorator,用返回的新函数覆盖原函数名