1. 程式人生 > >python-------裝飾器

python-------裝飾器

open isp over get spl 函數功能 style 先來 hide

一、簡單的裝飾器

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 @wrapper 10 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 @timmer 11 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 inner
10 
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 inner
10 
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-------裝飾器