本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!
1.装饰器定义
装饰器
本质上是一个函数
,可以接受一个函数
作为参数
2.装饰器简单的例子
- 承接之前的内容,英雄释放火焰技能。打印出英雄释放技能的时间
#!/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
装饰器负责打印释放技能的时间
(yiluo) ➜ Code python hero.py
2019-12-12 11:11:49
关羽-->释放技能:fire
release_skill
- 我们运行
hero
函数的时候,同时打印出了英雄释放火焰技能的时间 - 可是我们发现了一个比较严重的问题,
hero
函数应变成了release_skill
函数了,看上面的代码,确实hero
已经被release_skill
改变了 - 那如何解决这个被改变的问题呢? 总不能用完装饰器,被装饰的函数已经不是之前的函数吧,还好
Python
提供了方法解决这个问题
#!/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()
,然后我们运行一下看下结果函数是否被改变
(yiluo) ➜ Code python hero.py
2019-12-12 11:25:38
关羽-->释放技能:fire
hero
- 函数依旧是
hero
,看来是完美解决了这个问题 @
是Python
提供的语法糖,语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用
3.带参数的装饰器(…待续)
享受每一天,Just Enjoy !