Python基礎知識之裝飾器
裝飾器
https://www.cnblogs.com/EVA-J/articles/7194277.html
1. 裝飾器的形成過程
2.裝飾器的作用
3.語法糖
原則: 開放封閉原則
----------------------------------------------------------------------------------------------------------------------------------------------------------------
固定模式:裝飾器固定模式
===========================================================================================
1.
import time def func(): time.sleep(0.01) print("大家好") def timer(f): start = time.time() f() end = time.time() print(end-start) timer(func)
解讀這段程式碼 !
首先 ,我們定義一個函式 func為例實現 leader交給我的功能! ok ,這個func函式假裝已經完成我們想要的功能 。
現在 我們想要在func函式的基礎上增加 計算程式執行時間的功能,引入time 模組 ,通過 time.time()獲取當前時間
這樣 ,我們的func函式可以這樣寫
def func():
start = time.time() # 程式執行前時間
print("大家好,才是真的好!") # 這裡假裝是我們的業務邏輯程式碼,想象這有很多行好吧。
end = time.time() # 程式執行結束時間
print(end - start) # 獲取時間差,就可以知道程式執行時間的長短了。
這樣就是我們在函式原有的基礎上擴充套件的功能 !
但是,違背了我們開發中的 開放-封閉原則!
開放:對擴充套件是開放的
封閉:對修改是封閉的
不想修改函式的呼叫方式,但是還在原有的函式前後新增功能
----------------------------------------------------------------------------------
那我們把 要增加功能的函式當作引數
增加一個裝飾器函式
def timer(f):
def inner()
start = time.time()
f()
end = time.time()
print(end-start)
return inner
func = timer() # 這裡返回的是inner 相當於把inner的記憶體地址賦值給了func
func() 這裡實際執行的是 inner() ----- 最終獲取了 print(end-start)
ok, 這就是我們的裝飾器函式
timer就是一個裝飾器函式,只是對一個函式 有一些裝飾作用
===========================
語法糖的概念
就是讓程式碼更簡潔,像吃糖一樣開心 ~~哈哈
@timer #裝飾器函式的函式名
def func():
pass # 要貼著被裝飾的函式
這才是真正的 不改變函式呼叫方式
裝飾帶引數函式的裝飾器
19.27 動態引數 !!!
*arg **kwargs 能hold整個世界
wrapper 裝飾器
www.cnblogs.com/eva-j/articles/7194277.html