python裝飾器本質上就是乙個函式,它可以讓其他函式在不需要做任何**變動的前提下增加額外的功能,裝飾器的返回值也是乙個函式物件(函式的指標)。裝飾器函式的外部函式傳入我要裝飾的函式名字,返回經過修飾後函式的名字;內層函式(閉包)負責修飾被修飾函式。從上面這段描述中我們需要記住裝飾器的幾點屬性,以便後面能更好的理解:
python裝飾器有很多經典的應用場景,比如:插入日誌、效能測試、事務處理、許可權校驗等。裝飾器是解決這類問題的絕佳設計。並且從引入中的列子中我們也可以歸納出:裝飾器最大的作用就是對於我們已經寫好的程式,我們可以抽離出一些雷同的**組建多個特定功能的裝飾器,這樣我們就可以針對不同的需求去使用特定的裝飾器,這時因為原始碼去除了大量泛化的內容而使得原始碼具有更加清晰的邏輯。
# 這是最原始的裝飾器
import time #時間模組你們好def timmer(func):
def inner():
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print("**********%s**********="%(end_time-start_time))
return inner
def func():
print("你們好")
f = timmer(func)
f()#執行結果:
**********0.1000056266784668**********=
import time0.8000459671020508def decorator(func):
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
@decorator
def func():
time.sleep(0.8)
func() # 函式呼叫
#執行結果:
完整的裝飾器(萬能裝飾器)
概念開放封閉原則
開放:他對擴充套件是開放的
封閉:他對修改是封閉的
裝飾器使用的就是開放 封閉原則
#裝飾器的固定結構def inner(*args,**kwargs):
''' 被裝飾函式執行之前新增的**'''
ret = func(*args,**kwargs)
''' 被裝飾函式執行之後新增的**'''
return ret
return inner
def fun1(a,b):
print(a+b)
fun1(1,2)
裝飾器小例子
# def login():# username = input('使用者名稱:')
# password = input('密碼:')
# if username == 'alex' and password == 'somebody':
# print('登入成功')
# def art():
## def dar():
# print('歡迎來到日記頁')
#用裝飾器來實現,訪問art或者dar函式,登入一次後無需再登入
函式:
flag = falsedef login(func):
def inner(*args,**kwargs):
global flag
if flag == false:
username = input('使用者名稱:')
password = input('密碼:')
if username == 'alex' and password == 'somebody':
print('登入成功')
flag = true
if flag == true:
ret = func(*args,**kwargs)
return ret
return inner
@login
def art():
@login
def dar():
print('歡迎來到日記頁')
art()
dar()
類裝飾器以及裝飾器鏈
高階函式 裝飾器
1,高階函式 裝飾器 閉包 1 存在於巢狀關係的函式中 2 巢狀函式引用外部函式變數 3 外部函式會將內部函式名作為返回值返回 1 裝飾器是乙個閉包 2 執行過程 3 外部函式執行後並沒有 要被裝飾的函式,沒有引數,沒有返回值 def outer func print 開始裝飾 def inner ...
Python高階函式 裝飾器
由於函式也是乙個物件,而且函式物件可能被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2018 4 11 f now f 2018 4 11 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...
Python 高階函式 裝飾器
裝飾器 定義裝飾器本身是乙個可呼叫物件,接收乙個函式作為引數,然後將其返回或替換成另乙個函式或可呼叫物件。可以理解成,原來那是一堵白牆,經過了一層裝飾,這層裝飾可能是漆也可能把牆掏空鑲進一層 變得金光閃閃,最後呈現在你眼前的就是裝飾後的樣子。可以把它完全當成常規函式來呼叫,其引數是另乙個函式。裝飾器...