python-------裝飾器

來源:互聯網
上載者:User

標籤:執行時間   擴充   nbsp   start   one   為什麼   closed   pytho   isp   

一、簡單的裝飾器

1.為什麼要使用裝飾器呢?

  裝飾器的功能:在不修改原函數及其調用方式的情況下對原函數功能進行擴充

  裝飾器的本質:就是一個閉包函數

那麼我們先來看一個簡單的裝飾器:實現計算每個函數的執行時間的功能

 1 import time  2 def  wrapper(func): 3         def inner(): 4               start=time.time() 5               func() 6               end=time.time() 7               print(end-start) 8         return inner  9     10 def  hahaha():11         time.sleep(1)12         print(‘aaaaa‘)13 hahaha=wrapper(hahaha)14 hahaha()    
簡單的裝飾器

上面的功能有點不簡介,不完美,下面就引進了文法糖。

 1 import time 2 def wrapper(func): 3         def inner(): 4                start=time.time() 5                func() 6                end=time.time() 7                print(end-start) 8         return inner 9 @wrapper10 def  kkk():#相當於kkk=wrapper(kkk)11     print(‘aaaaa‘)12 kkk()             
裝飾器-------文法糖

以上的裝飾器都是不帶參數的函數,現在裝飾一個帶參數的該怎麼辦呢?

 1 import time 2 def timmer(func): 3     def inner(a): 4         start=time.time() 5         func(a) 6         end=time.time() 7         print(end-start) 8     return inner 9 10 @timmer11 def hahaha(a):12     time.sleep(1)13     print(a)14 15 16 hahaha(5)   
帶一個參數的裝飾器
 1 import time 2 def timer(func): 3     def inner(*args,**kwargs): 4         start = time.time() 5         re = func(*args,**kwargs) 6         end=time.time() 7         print(end- start) 8         return re 9     return inner10 11 @timer   #==> func1 = timer(func1)12 def func1(a,b):13     print(‘in func1‘)14     print(a,b)15 16 @timer   #==> func1 = timer(func1)17 def func2(a):18     print(‘in func2 and get a:%s‘%(a))19     return ‘fun2 over‘20 21 func1(1,2)22 print(func2(‘aaaaaa‘))
原函數帶多個參數的裝飾器
 1 import time 2 def timer(func): 3     def inner(*args,**kwargs): 4         start = time.time() 5         re = func(*args,**kwargs) 6         end=time.time() 7         print(end - start) 8         return re 9     return inner10 11 @timer   #==> func1 = timer(func1)12 def jjj(a):13     print(‘in jjj and get a:%s‘%(a))14     return ‘fun2 over‘15 16 jjj(‘aaaaaa‘)17 print(jjj(‘aaaaaa‘))
帶傳回值的裝飾器

二、開放封閉原則

1.對擴充是開放的

2.對修改是封閉的

 三、裝飾器的固定結構

 

 1 import time 2 def wrapper(func):  # 裝飾器 3     def inner(*args, **kwargs): 4         ‘‘‘函數執行之前的內容擴充‘‘‘ 5         ret = func(*args, **kwargs) 6          ‘‘‘函數執行之前的內容擴充‘‘‘ 7         return ret 8     return inner 9 10 @wrapper  # =====>aaa=timmer(aaa)11 def aaa():12     time.sleep(1)13     print(‘fdfgdg‘)14 aaa()
View Code

 

python-------裝飾器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.