python裝飾器進階

為什么要使用?

使用裝飾器使代碼變得整潔,并且能解決硬編碼問題,使用起來也很方便,但是理解起來相對沒那么容易,因此寫下這篇文章加深理解。下面以記錄日志的功能作為裝飾器的講解:

原始硬編碼版

下面的logit作為裝飾器,但是它只能裝飾有兩個參數(shù)的函數(shù),因此是硬編碼的。

def logit(func):
    def decorator(a, b):
        print("func %s is calling " % func.__name__)
        return func(a, b)
    return decorator

@logit()
def my_add(a, b):
    return a+b
  
my_add(1, 49)

可變參數(shù)版

使用*args, **kwargs將上述的硬編碼去除,使得裝飾器能裝飾不同的函數(shù)

def logit(func):
    def decorator(*args, **kwargs):
        print("func %s is calling " % func.__name__)
        return func(*args)
    return decorator

wraps通用版

輸出my_add.name發(fā)現(xiàn)函數(shù)的名稱改變了,不是我們想要的my_add,因此使用wraps改造

print(my_add.__name__)
from functools import wraps
def logit(func):
    @wraps(func)
    def decorator(*args, **kwargs):
        print("func %s is calling " % func.__name__)
        return func(*args)
    return decorator

自定義參數(shù)版

有時候需要向裝飾器來傳遞參數(shù),例如不同的函數(shù)需要不同的日志文件時:

def logit(log_name="add.log"):
    def decorator(func)
        @wraps(func)
        def wrapper(*args, **kwargs):
            log_str = "func %s is calling " % func.__name__
            print(log_str)
            with open(log_name, "a") as log_file:
              log_file.write(log_str)
            return func(*args)
        return wrapper
    return decorator
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 呵呵!作為一名教python的老師,我發(fā)現(xiàn)學生們基本上一開始很難搞定python的裝飾器,也許因為裝飾器確實很難懂...
    TypingQuietly閱讀 19,616評論 26 186
  • 原文出處: dzone 譯文出處:Wu Cheng(@nullRef) 1. 函數(shù) 在python中,函數(shù)通過...
    DraculaWong閱讀 545評論 0 3
  • Python的裝飾器的英文名叫Decorator,要對一個已有的模塊做一些“修飾工作”,所謂修飾工作就是想給現(xiàn)有的...
    Spareribs閱讀 679評論 1 11
  • 日復一日,年復一年,見過人的出生,也見過人的死亡,有時不經(jīng)會想人這一生究竟是為了什么。
    weylan閱讀 147評論 0 1