装饰器:
定义:本质是函数(装饰其他函数),意思就是为其他函数添加附加功能。
原则:1.不能修改被装饰函数的源代码
2.不能修改被装饰函数的调用方式
实现装饰器,要具备的知识:
1.函数即变量
2.高阶函数(满足下面一个条件就是高阶函数 )
a:把一个函数名当做实参传递给另外一个函数
b:返回值中包含函数名 (不修改函数的调用方式)
3.嵌套函数
高阶函数+嵌套函数==》装饰器
小虾这就来举一个比较常见的例子:
def decorator (func):
def inner():
# 验证1
# 验证2
# 验证3
return func()
return inner
@decorator =》f1=decorator(f1)
def f1():
print ('f1')
注意:@函数名 是python的一种语法糖。
如上例@decorator,内部会执行一下操作:执行decorator 函数,并将 @decorator 下面的 函数 作为decorator函数的参数,即:@decorator 等价于 decorator(f1)所以,内部就会去执行:
def inner:
#验证
return f1() # func是参数,此时 func 等于 f1
return inner # 返回的 inner,inner代表的是函数,非执行函数
# 其实就是将原来的 f1 函数塞进另外一个函数中
将执行完的 decorator 函数返回值赋值给@decorator下面的函数的函数名
decorator函数的返回值是:
def inner:
#验证
return 原来f1() # 此处的 f1 表示原来的f1函数
然后,将此返回值再重新赋值给 f1,即:新f1 = def inner:
#验证
return 原来f1()
所以,以后想要执行 f1 函数时,就会执行 新f1 函数,在 新f1 函数内部先执行验证,再执行原来的f1函数,然后将 原来f1 函数的返回值 。
上面提到的装饰函数没有参数:那么问题来了,如果其含有参数呢?又该如何呢?
def w1(func):
def inner(*args,**kwargs):
# 验证1
# 验证2
# 验证3
return func(*args,**kwargs)
return inner
@w1
def f1():
print("f1")
def f2(arg1,arg2,arg3):
print ("f2")
上面代码中通过在装饰器中的参数中使用(*args,**kwarge)(*args是非关键字参数,用于元组,**kw是关键字参数,用于字典),就可以装饰具有处理n个参数的函数的装饰器。(如果有什么不太明白的,可以查看这篇博客 https://blog.youkuaiyun.com/qq_33432841/article/details/107768100)
不后悔过去,不幻想未来,把握好现在,就是对自己最好的交代!!!!!!!!!!!!