1.装饰器
在有两个重名的函数中,Python解释器会调用最后定义的那重名函数,因为在Python里,第一个函数指向的是一片内存,然后又让这个函数指向另一片内存,就会利用第二片内存来执行,所有函数名应尽量避免相同
写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
- 封闭:已实现的功能代码块
- 开放:对扩展开发
- 实例:
def w1(func):
def inner():
# 验证1
# 验证2
# 验证3
func()
return inner
@w1 # 装饰器
def f1():
print('f1')
@w1 # 装饰器
def f2():
print('f2')
对于上述代码,也是仅仅对基础平台的代码进行修改,就可以实现在其他人调用函数 f1、 f2 、f3 、f4 之前都进行【验证】操作,并且其他业务部门无需做任何操作
2.装饰器的功能
- 引入日志
- 函数执行时间统计
- 执行函数前预备处理
- 执行函数后清理功能
- 权限校验等场景
- 缓存
- 如果是有多个装饰器的情况,一般是先装饰最下面的一个,然后依次往上,@w1类比于f1 = w1(f1)
3.装饰有参数的函数
在传递参数的时候,需要在闭包里面定义一个形参,闭包里面的调用的函数也要定义一个形参,否则会导致两部分函数调用失败
4.装饰不定长的参数的函数
在传递参数的时候,需要在闭包里面定义一个*args
和**kwargs
,闭包里面的调用的函数也要定义一个*args
和**kwargs
,这样就可以在调用的时候传递任意长度的参数,增加代码的可复用性
5.装饰带返回值的函数
需要在闭包里面进行一个接收,也就是ret = test(),然后再把接收到的ret return出去,这样在装饰的test才能返回出当前需要返回的东西,否则只会返回None
6.通用的装饰
def w1(func):
print("-----正在装饰-----")
def inner(*args,**kwargs):
print("---正在验证权限---")
print("----记录日志----")
ret = func(*args,**kwargs)
return ret
return inner
带有参数的装饰器:也就是在原来包含一个闭包的函数外面再给他套一个函数,用来传递装饰器的参数
def func_arg(arg):
def w1(func):
print("---记录日志---")
def inner(*args,**kwargs):
func(*args,**kwargs)
return inner
return w1
@func_arg("heihei")
def f1():
print("----f1----")
# 1.先执行func_arg("heihei")函数,这个函数return的结果是
# 2.@w1
# 3.使用@w1对f1进行装饰
# 作用:带有参数的装饰器,能够起到在运行时,有不同的功能