装饰器
什么是装饰器:
装饰器是一个函数,主要作用是用来包装另一个函数或类
包装的目的是在不改变原函数(或类名)的情况下改变被包装对象的行为
对原函数增加一段代码,或者直接替换原函数。函数装饰器
是指装饰器是一个函数,传入的是一个函数,返回的是一个函数语法:
def 装饰器函数名(参数):
语句块
return 函数对象
@装饰器函数名<换行>
def 函数名(形参列表):
语句块
- 作用:1.改变原有函数,重新绑定新函数
@装饰器函数:作用是直接将下面的原函数名‘重新绑定‘了装饰器函数返回的函数,替换/增添了原函数名绑定的函数。
1 如果:没有用形参,新函数没有变量需要调用(绑定)原来的函数,原函数会消失,完成了对原函数的替换
2 如果: 原函数名作为了新函数的形参需要接收的实参,新函数的形参绑定了原函数模块(即全局变量的函数名调用(绑定)了内嵌函数的函数名作为形参),如果内嵌函数(被装饰器改变后的新函数)中用到了外部的形参(即原函数名),则构成了闭包, 原函数不会消失,完成了对原函数的更改(即增加一段代码)
- 原理:
被装饰函数的变量/函数名绑定装饰器函数调用后的返回的函数。
示例:
#-------以下是第二层装饰器,操作后发送短信-------
def message_send(fm):
def fy(n, money):
fm(n, money) # 调用被装饰函数
print('短信正在发送', n, '.....')
return fy
#-------以下是第一层装饰器,验证权限-------
def privileged_check(fn):
def fx(name, x):
print('正在进行权限验证:')
if True:
fn(name, x)
else:
print("权限验证失败")
return fx
# -------以下原来的的函数---------
@message_send # 再解释的装饰器
@privileged_check #先解释的装饰器
def savemoney(name, x):
print(name, '存钱', x, '元')
# -------以下是函数调用程序-------
savemoney('小张', 300)
# 自我理解
# 解释时:
# 先执行距离原函数savemone最近的第一层装饰器
# 上面的@语句 装饰器相当于 savemoney = privileged_check(savemoney)
# 相当于 savemoney = fx, fn = 原来的savemoney
# 再执行第二近(第二层)距离的装饰器
# 上面的 @ 装饰器相当于savemoney = message_send(savemoney)
# 相当于 savemoney = fy, fm = 中间的 savemoney
# 执行时:
# 函数从外向内执行(按照函数调用)
# 先执行 savemoney = fy,即fy函数 , 然后顺序向下执行调用fm,
# 即调用函数中间的savemoney, 即fx,执行fx,顺序打印’正在验证‘顺序向下执行调用fn,
# 即原来的savemoney,最原始的函数,执行完后返回fx中fn处
# 向下执行,完后返回fy中的fm函数,向下顺序执行
# 打印print('短信正在发送。。。。。')