前言:
??在web開發過程中,經常會遇到數據查詢慢的問題,對于查詢一些時效性不是特別強的數據可以將數據緩存到redis中, 查詢的時候直接到緩存中讀取數據,這樣就可以大大加快查詢速度。
??但是在開發前,事先沒有增加緩存這個功能,并且需要增加緩存功能的地方又有很多,為了在不改變原有代碼的基礎上添加新的功能,這就要用到python的裝飾器。這里簡要記錄一下裝飾器的使用!
說明:
??弄清了裝飾器函數的執行流程,以及參數如何傳遞等,裝飾器的使用基本上就差不多了。這里通過一下幾步來學習裝飾器的使用:
??1.裝飾器的引入;
??2.被裝飾函數無參的裝飾器;
??3.被裝飾函數帶參的裝飾器;
??4.裝飾器帶參的裝飾器。
裝飾器的引入
# coding:utf-8
import time
def decorator(fun):
"""統計函數的運行時間"""
start = time.time()
fun()
end = time.time()
print end - start
def do_something():
for i in range(5):
time.sleep(1)
decorator(do_something)
代碼解讀:
??將do_something函數作為decorator函數的參數傳入,在decorator函數中實現新的業務邏輯,并調用do_something函數, 這樣就實現了在添加新功能的同時,不改變原有代碼的邏輯,該寫法不夠簡潔。
被裝飾函數無參的裝飾器
# coding:utf-8
import time
def decorator(fun):
def wrapper():
start = time.time()
fun()
end = time.time()
print end - start
return wrapper
@decorator
def do_something():
for i in range(5):
time.sleep(1)
do_something()
# 等價于:decorator(do_something)()
代碼解讀:
do_something()添加裝飾器后,等價于do_something() = decorator(do_something)(),執行過程如下:
- 執行decorator方法,并將do_something方法作為參數傳遞;
- 返回內層函數wrapper的引用;
- 執行wrapper方法,等價于decorator(do_something)()
被裝飾函數帶參的裝飾器
# coding:utf-8
import time
def decorator(fun):
def wrapper(*args, **kwargs):
start = time.time()
fun(*args, **kwargs)
end = time.time()
print end - start
return wrapper
@decorator
def do_something(times):
for i in range(times):
time.sleep(1)
do_something(5)
# 等價于:decorator(do_something)(5)
代碼解讀:
do_something(params)添加裝飾器后,等價于do_something(params) = decorator(do_something)(params),執行過程如下:
- 執行decorator方法,并將do_something方法作為參數傳遞;
- 返回內層函數wrapper的引用;
- 執行wrapper方法,等價于decorator(do_something)(params),可知,參數是通過內層函數wrapper傳遞進來的。
裝飾器帶參的裝飾器
# coding:utf-8
import time
def decorator(name="帶參裝飾器"):
def wrapper(fun):
def inner(*args, **kwargs):
start = time.time()
fun(*args, **kwargs)
end = time.time()
print end - start
print name
return inner
return wrapper
@decorator(name="帶參裝飾器")
def do_something(times):
for i in range(times):
time.sleep(1)
do_something(5)
# 等價于:decorator("帶參裝飾器")(do_something)(params)
代碼解讀:
do_something(params)添加裝飾器后,等價于do_something(params) = decorator("帶參裝飾器")(do_something)(params),執行過程如下:
- 執行decorator方法,并傳遞參數name,
- 返回內層函數wrapper的引用,wrapper = decorator("帶參裝飾器")
- 執行wrapper方法, 并傳遞do_something方法的引用,返回inner函數的引用,inner = decorator("帶參裝飾器")(do_something)
- 執行inner方法,并傳遞參數params,實現inner方法的內部邏輯, 即:decorator("帶參裝飾器")(do_something)(params)
喜歡點個贊!