天天看點

Python基礎進階 Zero to Hero裝飾器(一)

Python基礎進階 Zero to Hero裝飾器(一)
本文首發于伊洛的個人部落格: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.帶參數的裝飾器(…待續)
Python基礎進階 Zero to Hero裝飾器(一)
Python基礎進階 Zero to Hero裝飾器(一)
享受每一天,Just Enjoy !
Python基礎進階 Zero to Hero裝飾器(一)

繼續閱讀