本文實例講述了Python裝飾器用法。分享給大家供大家參考,具體如下:
一、裝飾器是什么
python的裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。簡單的說裝飾器就是一個用來返回函數的函數。
它經常用于有切面需求的場景,比如:插入日志、性能測試、事務處理、緩存、權限校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數功能本身無關的雷同代碼并繼續重用。
概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。
二、為什么需要裝飾器
1、先來看一個簡單例子:
def foo():print('i am foo')2、增加需求
現在有一個新的需求,希望可以記錄下函數的執行日志,于是在代碼中添加日志代碼:
def foo(): print('i am foo') print("foo is running")3、又有需求
假設現在有100個函數需要增加這個需求,并且后續可能還要對這一百個函數都增加執行前打印日志的需求,怎么辦?還一個個改嗎?
當然不了,這樣會造成大量雷同的代碼,為了減少重復寫代碼,我們可以這樣做,重新定義一個函數:專門處理日志 ,日志處理完之后再執行真正的業務代碼。
def use_logging(func): print("%s is running" % func.__name__) func()def bar(): print('i am bar')use_logging(bar)#result:#bar is running#i am bar通過以上use_logging函數我們增加了日志功能,不管以后有多少函數需要增加日志或者修改日志的格式我們只需要修改use_logging函數,并執行use_logging(被裝飾的函數)就達到了我們想要的效果。
def use_logging(func): print("%s is running" % func.__name__) return func@use_loggingdef bar(): print('i am bar')bar()三、基礎裝飾器入門
1、裝飾器語法糖
python提供了@符號作為裝飾器的語法糖,使我們更方便的應用裝飾函數。但使用語法糖要求裝飾函數必須return一個函數對象。因此我們將上面的func函數使用內嵌函數包裹并return。
裝飾器相當于執行了裝飾函數use_loggin后又返回被裝飾函數bar,因此bar()被調用的時候相當于執行了兩個函數。等價于use_logging(bar)()
def use_logging(func): def _deco(): print("%s is running" % func.__name__) func() return _deco@use_loggingdef bar(): print('i am bar')bar()2、對帶參數的函數進行裝飾
現在我們的參數需要傳入兩個參數并計算值,因此我們需要對內層函數進行改動傳入我們的兩個參數a和b,等價于use_logging(bar)(1,2)
新聞熱點
疑難解答