Python语言 装饰器浅析
小标 2018-10-09 来源 : 阅读 1266 评论 0

摘要:本文主要向大家介绍了Python语言 装饰器浅析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言 装饰器浅析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

Python 装饰器是 Python 中常常使用到的一种语法糖,它可以大幅度减少重复代码,使用起来十分方便。另一方面,装饰器的定义往往会导致出现函数重重嵌套的情况,这会给装饰器的实现者带来阅读代码的困难。本文剖析 Python 装饰器的定义与用法。不带参数的装饰器我们先来看一下不带参数的装饰器的实现,这种情况比较简单。以下是一个不带参数的装饰器的使用例子:@decoratordef fun():
    print('fun() is called')前面提到,装饰器只是 Python 提供的语法糖,使用@decorator作为装饰器相当于:def fun():
    print('fun() is called')
fun = decorator(fun)我们再来看一下装饰器decorator本身的定义。装饰器可以使用函数实现,也可以使用类来实现,这里我们介绍函数的实现方式。def decorator(fun):
    def decorated_function():
        print('before fun, do something')
        fun()
        print('after fun, do something')    return decorated_function装饰器decorator被定义成一个函数,这个函数返回一个新的函数。同时,我们看到decorator接受一个fun的形参,fun作为一个函数,会在decorated_function中被调用。使用装饰器后,如果调用fun(),则会输出:before fun, do something 
  fun() is called 
  after fun, do something通过装饰器decorator,原来的fun函数,被赋值成decorator(fun),而decorator(fun)会触发decorator函数的调用并返回decorated_function这个函数。在decorated_function中,会先输出before fun, do something,然后调用fun(),最后输出after fun, do something。带参数的装饰器装饰器支持带参数,我们先来看下带参数的装饰器的使用方式。@cached(5)def fun():
    print('fun() is called')上面带参数的装饰器的使用,等价于以下的代码:def fun():
    print('fun() is called')
fun = cached(5)(fun)装饰器cached被定义成一个函数,它的定义如下:def cached(timeout):
    def decorator(func):
        def decorated_function():
            print('before fun, do something, timeout=%d' % timeout)
            func()
            print('after fun, do something, timeout=%d' % timeout)        return decorated_function    return decorator即cached是一个函数,它接受一个timeout的形参,并返回一个decorator的函数。cached(5)会进行函数调用且函数的实参为5,并返回decorator。decorator也是个函数,decorator(fun)(即cached(5)(fun))相当于上面不带参数的装饰器的使用,它返回decorated_function这个函数。 看起来有点复杂,实际上,带参数的装饰器只是在不参数的装饰器的基础上再多一层函数的封装而已,多的这层函数是为了将装饰器的参数传递进去。使用装饰器后,如果调用fun()函数,则会输出:before fun, do something, timeout=5 
  fun() is called 
  after fun, do something, timeout=5

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved