享受每一天,Just Enjoy !

0%

Python基础进阶 Zero to Hero装饰器(一)

1.装饰器定义
  • 装饰器本质上是一个函数,可以接受一个函数作为参数
    2.装饰器简单的例子
  • 承接之前的内容,英雄释放火焰技能。打印出英雄释放技能的时间
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/python
    from datetime import datetime

    def release_skills(hero):
    def release_skill(*skill, **skills):
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    return hero(*skill, **skills)
    return release_skill


    @release_skills
    def hero(name, skill):
    return (name + '-->'+'释放技能:'+ skill)


    print(hero('关羽', 'fire'))
    print(hero.__name__)
  • 如上,release_skills装饰器负责打印释放技能的时间
    1
    2
    3
    4
    (yiluo) ➜  Code python hero.py
    2019-12-12 11:11:49
    关羽-->释放技能:fire
    release_skill
  • 我们运行hero函数的时候,同时打印出了英雄释放火焰技能的时间
  • 可是我们发现了一个比较严重的问题,hero 函数应变成了release_skill函数了,看上面的代码,确实hero已经被release_skill改变了
  • 那如何解决这个被改变的问题呢? 总不能用完装饰器,被装饰的函数已经不是之前的函数吧,还好Python 提供了方法解决这个问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/python
    from datetime import datetime
    from functools import wraps

    def release_skills(hero):
    @wraps(hero)
    def release_skill(*skill, **skills):
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    return hero(*skill, **skills)
    return release_skill


    @release_skills
    def hero(name, skill):
    return (name + '-->'+'释放技能:'+ skill)


    print(hero('关羽', 'fire'))
    print(hero.__name__)
  • 上面的代码用到了wraps(),然后我们运行一下看下结果函数是否被改变
    1
    2
    3
    4
    (yiluo) ➜  Code python hero.py
    2019-12-12 11:25:38
    关羽-->释放技能:fire
    hero
  • 函数依旧是hero,看来是完美解决了这个问题
  • @Python 提供的语法糖,语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用
    3.带参数的装饰器(……待续)
    在这里插入图片描述

    享受每一天,Just Enjoy !

关注公众号获取更多内容