装饰器

Day21 装饰器

如何理解装饰器?无参装饰器、带参装饰器、functools模块介绍在装饰器中的使用、函数装饰器装饰类、类装饰器

08-16侠课岛    基础入门       

后端/后端/Python 由浅入深入门 10     0     179

总结

1.什么是装饰器

  • 装饰器其实就是一个闭包,把一个函数当做参数然后返回一个替代版函数;

  • 装饰器的功能在于对函数或类功能的增强,这是一种低耦合的功能增强;

2.装饰器特点

  • 开放封闭原则,即对扩展是开放的,对修改时封闭的;

  • 装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象;

  • 装饰器的功能是在不修改被装饰器对象源代码以及被装饰器对象的调用方式的前提下为其扩展新功能;

  • 装饰器本质是函数,(即装饰其他函数)就是为其他函数添加附加功能;

3.无参装饰器

  • 就是不带参数的装饰器,是最简单的装饰器,返回包裹函数;

  • *args表示的参数以列表的形式传入;

  • **kwargs表示的参数以字典的形式传入;

  • @decorator这个语法相当于 执行 func = decorator(func),为func函数装饰并返回,且@修饰符必须出现在函数定义前一行,不允许和函数定义在同 一行;

4.带参装饰器

  • 就是带参数的装饰器,即复杂装饰器,返回包裹函数;

  • 实现一个装饰器,它用来检查被装饰函数的参数类型,装饰器可以通过参数指明函数参数的类型,调用时如果检测出类型不匹配则抛出异常。

5.functools模块

  • 用来拷贝属性;

  • functools,用于高阶函数,指那些作用于函数或者返回其它函数的函数,通常只要是可以被当做函数调用的对象就是这个模块的目标。

今天学习的是装饰器,主要分为带参和不带参的两种装饰器,装饰器是多样变化的,大家一定要多实践几遍,多熟悉熟悉;

课外补充

为什么去掉装饰器内层函数warpper会报错?

答:decorated这个函数里面,要记得返回f函数哦,装饰器是需要返回传入的函数的,并且反回的不需要加入括号(),加入括号就会报错,也可以理解为加入括号,没有调用久执行了,效果如下图:

wraps函数的作用?

答: 如图所示,在python中,我们使用了装饰器后,定义了增强函数my_dec_example(),然后返回增强的函数用来装饰example()这个函数,然后我们调用example()函数,这个时候实际间接调用了my_dec_example()函数,python会认为这个函数属性如名称等就是my_dec_example()的函数的属性。

但实际上我们调用的是example()这个函数,函数的属性应该都是example()相关的,所以为了解决这样的问题,就使用@functools.wraps(fn)这个函数,它的作用是拷贝属性,也就是把fn函数的属性拷贝带过来,比如:__name__,给到返回的函数my_dec_example(),这样,我们调用example()的时候,example()已有的属性在传给装饰器函数,然后再返回来,就避免私有属性不一致的问题了。

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

10

本课评分:
  •     非常好
难易程度:
  •     适中的

内容目录



|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?