Python之专业提高篇----装饰器

1、装饰器

1) 什么是装饰器

·装饰器是一个函数,主要作用是用来包装另一个函数或者类
·包装的目的是在不改变原函数(或类名)的情况下改变被包装对象的行为(增加项目的功能)

2)函数装饰器

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

3)语法

def 装饰器函数名(参数):
    语句块
    return 函数对象
@装饰器函数名
def 函数名(形参列表):
    语句块

4)原理:被装饰函数的变量(函数名)绑定装饰器函数调用的返回的函数
5)示例

 # 此示例示意函数装饰器的定义及调用和装饰原理
 # 相当于更换了  myfun()  绑定的函数
def mydeco(fn):     # <<<---- 装饰器函数
    def fx():
        print("fx被调用")
    return fx
@mydeco
def myfun():
    print("myfun被调用")
myfun()

上述mydeco的原理是在 def myfun语句之后加了如下语句 myfun = mydeco(myfun),如下所:

def mydeco(fn):     # <<<---- 装饰器函数
    def fx():
        print("fx被调用")
    return fx
def myfun():
    print("myfun被调用")
myfun = mydeco(myfun)
myfun()

输出如下所示:

fx被调用

6)此示例示意装饰器函数用来包装装饰器函数

def mydeco(fn):
    def fx():
        print("-------装饰器被调用之前--------")
        fn()
        print("-------装饰器被调用之后--------")
    return fx
@mydeco
def myfun():
    print("myfun被调用")
myfun()  # 调用myfun()

7)此示例示意装饰器的应用场合及功能

# 在员工A 和员工B 都不能够进行二次开发的情况下,以下是员工C 写的装饰器,增加权限验证功能
def privileged_check(fn):
    def fx(name,x):
        print("正在验证。。。")
        if True:
            fn(name,x)
        else:
            print("权限验证失败")
    return fx
##---  分隔 ---
# 员工A 的代码:实现存钱、取钱业务功能实现
@privileged_check
def savemoney(name,x):  # 存钱业务
    print(name,'存钱',x,'元')
##---  分隔 ---
@privileged_check
def getmoney(name,x):
    print(name,'取钱',x,'元')
##---  分隔 ---
# 员工B 代码:存钱、取钱
savemoney('小王',200)
savemoney('小赵',400)
getmoney('小李',500)

输出如下:

正在验证。。。
小王 存钱 200 元
正在验证。。。
小赵 存钱 400 元
正在验证。。。
小李 取钱 500 元

8)上例扩展。在原有基础上增加:存钱、取钱完成之后的发送短信功能

def privileged_check(fn):       # 装饰器
    def fx(name,x):
        print("正在验证。。。")
        if True:
            fn(name,x)
        else:
            print("权限验证失败")
    return fx
##---分隔符---
def messege_send(fn):
    def fy(n,money):
        fn(n,money)     # 调用被装饰函数
        print("正在发送短信。。。")
    return fy
##---分隔符---
@messege_send           # 相当于双层包装,由内向外调用
@privileged_check
def savemoney(name,x):  # 存钱业务
    print(name,'存钱',x,'元')
##---分隔符---
@messege_send           # 相当于双层包装,由内向外调用
@privileged_check
def getmoney(name,x):
    print(name,'取钱',x,'元')
##---分隔符---
savemoney('小王',200)
savemoney('小赵',400)
getmoney('小李',500)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值