python的装饰器

(本人编写是基于自己理解,有不对之处还请多多指教)
一、引言
炎热的夏天到了,每每走到商场都被漂亮的裙子、创意的首饰等等所心动,没别的就是人的爱美天性使然。在如今社会衣食无忧了,人们开始讲究吃饭穿衣的质量问题。好了言归正传,今天我想说的就是类似商场的首饰一样的装饰器。
在python中我们编完程序后,有时候想给他增加一些附加功能,但是又不想改变原代码,那怎么办呢?装饰器来帮你搞定,那什么是装饰器?装饰器怎么使用呢?
二、什么是装饰器
(1)简单理解
装饰器是用来修饰其他函数,为其他函数添加附加功能。
装饰器的本质是有返回值的函数,返回值也是一个函数。
(2)装饰器的原则
添加装饰器,对原函数的执行无任何影响。详细说:
不能修改被修饰的函数的源代码;
不能修改被修饰函数的调用方式。
(3)实现的原理
原理有点偷梁换柱的感觉,为什么呢?下面我用一个简单的例子,通俗的讲一下:
例子:主函数:A
辅助功能函数:B(记录运行时间的功能)
解释:实际我们是定义一个嵌套函数,外层函数的参数为被修饰函数的名字A,内层函数(B)增加计时功能,并调用修饰函数,结果返回值为内层函数的名字B(此时的A已经是增加计时功能的A—B(A)了,是不是偷梁换柱呢)
不明白的可以接着往下看具体实例。
说明,以下我们以给小朋友分发小礼物为例子讲解三种程度的装饰,小朋友是被修饰函数,戴皇冠(或者发小汽车)是装饰器。
三、被修饰函数无参数
(1)代码

在这里插入图片描述
(2)运行结果:
在这里插入图片描述
(3)代码解释
@crown在第一段运行时:
1.先是在python解释器的解释下,进入demo函数体存放在内存中,之后返回demo,即crown运行结果是dingding_girl=crown(dingding_girl)=demo的内存地址;
2.之后进行dingding_girl()的运行就是demo(),也就是我所谓的偷梁换柱。
四、被修饰函数有参数
(1)问题
如果被修饰的函数,有的带参数,有的不带参数,那么装饰器的使用就会报错如图所示:
在这里插入图片描述
(2)借助不定参数(或称参数组)进行解决
在这里插入图片描述
五、装饰器含参数
假如只给女孩戴焕冠,给男孩发小汽车那这个程序如何修改呢?
解决办法,调用前判断一下性别就好了。
(1)代码
在这里插入图片描述
(2)运行结果
是不是很惊喜,可以根据性别给小朋友发礼物了(此处鼓励一下自己,o( ̄︶ ̄)o)
在这里插入图片描述
(3)解释
其实这步只是增加了一层判断性别。根据性别派发礼物,嵌套多增加一层而已。

到此给小朋友分发礼物的装饰器讲完了。在一些权限管理、日志添加等等场景中,希望实际工作中能有所帮助。
六、实际工作中遇到的场景
(1)设置重复执行某一个场景,增加执行次数的装饰器

def repeat(times):
    def repeat_helper(f):
        def call_helper(*args):
            print("开始时间是{}".format(datetime.datetime.now()))
            for i in range(0, times):
                print("执行第{}次".format(i))
                f(*args)
            print("结束时间是{}".format(datetime.datetime.now()))
        return call_helper

    return repeat_helper

@repeat(100)
def test():
    print("12345,上山打老虎")

最后效果是重复执行100的"12345,上山打老虎"

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值