装饰器

装饰器

  • 什么是装饰器:
    装饰器是一个函数,主要作用是用来包装另一个函数或类
    包装的目的是在不改变原函数(或类名)的情况下改变被包装对象的行为
    对原函数增加一段代码,或者直接替换原函数。

  • 函数装饰器
    是指装饰器是一个函数,传入的是一个函数,返回的是一个函数

  • 语法:

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('短信正在发送。。。。。')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值