1、什麼樣的函式稱為閉包函式?
主要滿足兩點:函式內部定義了函式,引用了外部變數但非全域性變數
2、python裝飾器用於擴充套件原來函式功能的一種函式
3、裝飾器的作用:它可以讓被裝飾的函式在不需要做任何**變動的前提下增加額外的功能,裝飾器的返回值也是乙個函式物件
(函式的指標)
裝飾器的外部函式傳入我要裝飾的函式名字,返回經過修飾後函式的名字;內層函式(閉包)負責修飾被裝飾的函式。從上面記住幾點屬性,以後便於後面更好的理解:
實質:是乙個函式
引數:是你要被裝飾的函式名(並非呼叫函式)
返回:是裝飾完的函式名(也非呼叫函式)
作用:為已經存在的物件新增額外的功能
特點:不需要對物件**做任何**上的變動
import time
def func():
time.sleep(0.01)
print('**執行時長:裝飾器')
def timmer(f): # 裝飾器函式
def inner():
start = time.time()
f() # 被裝飾器的函式
end = time.time()
print(end-start)
return inner
func = timmer(func)
func()
# **執行時長:裝飾器
# 0.01500082015991211
4、python裝飾器有很多經典的應用場景,比如:插入日誌的效能測試、事務處理、許可權校驗等。
裝飾器是解決這類問題的絕佳設計。
5、函式原則:開放封閉原則
(1)開放:對擴充套件是開放的
(2)封閉:對修改是封閉的
6、語法糖
import time
def timmer(f): # 裝飾器函式
def inner():
start = time.time()
ret = f() # 被裝飾的函式
end = time.time()
print(end - start)
return ret
return inner
@timmer # @裝飾器的函式名
def func():
time.sleep(0.01)
print('被裝飾的函式')
return '裝飾器'
print(func())
8、裝飾器的固定模式
# 例子
import time
def timmer(f): # 裝飾器函式
def inner(*args,**kwargs):
"""被裝飾的函式執行前增加的功能"""
ret = f(*args,**kwargs) # 被裝飾的函式
"""被裝飾的函式執行後增加的功能"""
return ret
return inner
@timmer # @裝飾器名
def func(a,b): # 被裝飾的函式
time.sleep(0.01)
print('被裝飾器函式 ')
return '裝飾器'
func = timmer(func) # 演變原理
print(func(1,2))
9、複習裝飾器:
(1)開發原則:開放封閉原則(即只可擴充套件功能,不可修改函式)
(2)裝飾器的作用:在不改變原函式呼叫方式的情況下,在函式的前後新增功能
(3)裝飾器的本質:閉包函式
import time
def inner(*args,**kwargs):
"""呼叫被裝飾的函式執行前新增的功能"""
ret = f(*args,**kwargs)
"""呼叫被裝飾的函式執行後新增的功能"""
return ret
return inner
def holiday(day):
print('全天放假%s天'%day)
return '好開心!'
ret = holiday(3)
print(ret)
如果想要在函式內定義全域性作用域,需要加上global修飾符 詳解裝飾模式
顧名思義,裝飾模式就是給乙個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同乙個介面,裝飾物件持有被裝飾物件的例項,關係圖如下 source類是被裝飾類,decorator類是乙個裝飾類,可以為source類動態的新增一些功能,如下 public inte ce sourceabl...
Python函式裝飾器詳解
3 內建裝飾器 增強函式或類的功能的乙個函式,可以裝飾函式,也可以裝飾類 def time decorator func 裝飾器 def args,kwargs 在函式前列印開始時間 start time time.time print start time is start time 執行待裝飾函...
python 在場景中理解裝飾器
原來我也自己通過查資料,來學習python的裝飾器,但是效果不好。因為沒有接觸過需要用到裝飾器的場景,所以 一起的資料都只停留在紙面上,但是今天偶然看到了vimer的這篇文章 我們就根據這篇文章的思路來,在場景中理解python裝飾器 解決方案 該爬蟲呼叫三個方法,設計乙個通用的方法 根據每個方法的...