本文首發于伊洛的個人部落格: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 !