Python學習:11.Python裝飾器講解(二)

回顧python

  上一節咱們進行了Python簡單裝飾器的講解,可是python的裝飾器還有一部分高級的使用方式,這一節就針對python裝飾器高級部分進行講解。函數

爲一個函數添加多個裝飾器學習

  今天,老闆又交給你一個任務,老闆說:"以前的裝飾器用用起來挺好,可是此次我須要再次添加更多的參數,這個任務就交給你了,好好幹。",這種時候,咱們就能夠針對一個函數使用多個裝飾器。spa

import datetime def hel(func): def inner(*args,**kwargs): r = func(*args,**kwargs) print('bye') return r return inner def hel1(func): def inner(*args,**kwargs): print('start time:%s' % datetime.datetime.now()) r = func(*args,**kwargs) print('end time:%s'%datetime.datetime.now()) return r return inner @hel1 @hel def f1(name): print('hello') print(name) name = 'alexsel' f1(name) 執行結果: start time:2018-07-01 10:36:02.085027 hello alexsel bye end time:2018-07-01 10:36:02.086027

此次咱們在對以前代碼添加數據的時候,咱們寫了第二個裝飾器,咱們使用這個裝飾器針對以前的函數再次增長新的功能,輸出了開始結束時間。code

代碼及輸出問題解析

針對剛纔多個裝飾器,咱們須要瞭解的是在進行輸出的時候是怎麼進行輸出的,首先裝飾器函數hel首先對f1函數進行裝飾,而後裝飾器函數hel1在對被hel裝飾過函數進行裝飾,最後執行兩次裝飾過的函數。在新添加的裝飾器中(hel1)的func所指的函數是已經被hel裝飾過的函數。對象

帶參數的裝飾器blog

  裝飾器在調用的時候能夠傳入相應的參數,傳入參數之後咱們能夠根據不一樣的參數,針對函數進行相應信息輸出。it

def use_log(level): def hel(func): def inner(*args,**kwargs): if level == 'warning': print('The current function:%s'%func.__name__) r = func(*args,**kwargs) return r return inner return hel @use_log(level = 'warning') def f1(name): print('hello') print(name) f1(name = 'alexsel') 輸出結果: The current function:f1 hello alexsel

上面的代碼就是能夠帶有參數的裝飾器,就是將之前咱們使用簡單的裝飾器進行了一次封裝,當咱們調用函數的時候,python能夠將咱們定義的裝飾器的參數傳入函數中。io

基於類的裝飾器function

  講解python的類裝飾器須要用到python類的知識,python的類咱們尚未進行學習,就先簡單瞭解一下。

  根據咱們剛纔對裝飾器的學習,咱們發現裝飾器若是須要正常運行,裝飾器所接受的對象必須是可調用的,而後在裝飾器內部在返回一個可調用的對象,通常狀況下,可調用的對象都是函數,特殊狀況是對象中寫入了__call__()方法就也是能夠調用的對象。

class Test(): def __call__(self): print('test') te = Test() te() 輸出結果: test

咱們是有類裝飾器的時候,可讓類的構造函數__init__()接受一個函數,而後重載一個__call__()而且返回一個函數,來達到裝飾器的目的。

class Test(): def __init__(self,func): self.func = func def __call__(self,*args,**kwargs): print('The current function:%s' % self.func.__name__) return self.func() @Test def tes(): print('obj') tes() 輸出結果: The current function:tes tes

裝飾器就是對原來函數、對象功能的擴展,至關於對函數從新封裝,重點須要理解的是裝飾器中返回的是函數,並且裝飾器所裝飾器的對象也須要是可調用的。今天裝飾器的高級部分就到這裏。

相關文章
相關標籤/搜索