实现原理:
基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数(无敌套娃)
实现效果:
可以在不改变原函数内部代码和调用方式的前提下,实现在函数执行和执行扩展的功能
适用场景:
多个函数统一在函数执行前后自定义一些功能
- 示例
#printOuter函数就是装饰器函数
def printOuter(origin):
def newPrint(*args,**kwargs):
print("原函数执行前")
value = origin(*args,**kwargs) #执行原函数
print("原函数执行后")
return value
return newPrint
#把func1作为参数传到printOuter函数中. 值为newPrint函数 然后赋值给func1, func1()则调用了newPrint().newPrint里面调用了原函数
@printOuter
def func1(a):
print("我是原函数func1的内容",a)
@printOuter
def func2(a,b):
print("我是原函数func2的内容",a,b)
@printOuter
def func3(a):
print("我是原函数func3的内容",a)
func1("你好")
func2("世界","真没")
func3("hello")
"""
装饰器:@函数名
@func
def func1:
...
等于把func1作为参数传入到func函数中 又把func(func1)执行的值赋值给func1
"""