1 什么是裝飾器
- 裝飾器他人的器具,本身可以是任意可調(diào)用對(duì)象,被裝飾者也可以是任意可調(diào)用對(duì)象。本質(zhì)就是函數(shù),功能就是為其他函數(shù)添加附加功能
- 裝飾器的原則:
1 不修改被裝飾對(duì)象的源代碼
2 不修改被裝飾對(duì)象的調(diào)用方式
- 裝飾器的本質(zhì)就是函數(shù),功能就是為其他函數(shù)添加附加功能
2裝飾器由什么組成
- 裝飾器由高階函數(shù)+函數(shù)嵌套+閉包組成
- 高階函數(shù)定義:
1.函數(shù)接收的參數(shù)是一個(gè)函數(shù)名
2.函數(shù)的返回值是一個(gè)函數(shù)名
3.滿足上述條件任意一個(gè),都可稱之為高階函數(shù)
- 函數(shù)的嵌套
在一個(gè)函數(shù)內(nèi)定義另外一個(gè)新的函數(shù)
def f1():
def f2():
def f3():
print('from f3')
f3()
f2()
f1()
- 閉包
閉包的意義:返回的函數(shù)對(duì)象,不僅僅是一個(gè)函數(shù)對(duì)象,在該函數(shù)外還包裹了一層作用域,這使得,該函數(shù)無論在何處調(diào)用,優(yōu)先使用自己外層包裹的作用域。通俗講,就是局部作用域,在自己作用域找不到,向上一層找,找不到再向上一層的上一層找,直到最外層
基本實(shí)現(xiàn)裝飾器
import time
"""
定義一個(gè)函test,在不改函數(shù)源代碼,和調(diào)用方法情況下得到其運(yùn)行時(shí)間
def test():
time.sleep(2)
print("函數(shù)test運(yùn)行了")
print("函數(shù)test運(yùn)行結(jié)束了")
"""
# 函數(shù)名作為入?yún)?-->高階函數(shù)
def timer(func):
def wrapper():
# 函數(shù)執(zhí)行前的時(shí)間
start_time = time.time()
func()
# 函數(shù)執(zhí)行后的時(shí)間
end_time = time.time()
# 相減得出運(yùn)行時(shí)間
res = end_time - start_time
print('運(yùn)行時(shí)間是:%s' %(res))
return res
return wrapper
def test():
time.sleep(2)
print("函數(shù)test運(yùn)行了")
print("函數(shù)test運(yùn)行結(jié)束了")
"""1.把函數(shù)名test作為入?yún)魅胝{(diào)用timer,
2.timer運(yùn)行后得到一個(gè)返回值timer函數(shù)嵌套的wrapper函數(shù)的內(nèi)存地址
3.把這個(gè)內(nèi)存地址存到test變量?jī)?nèi)
4.test+(),運(yùn)行這個(gè)返回的內(nèi)存地址即wrapper函數(shù),
wrapper函數(shù)內(nèi)拿到真正的原始的test函數(shù)名,
并且加了計(jì)時(shí)并運(yùn)行test函數(shù),得到運(yùn)行時(shí)間res
"""
test = timer(test)
test()
用@語法堂實(shí)現(xiàn)裝飾器
import time
"""
定義一個(gè)函test,在不改函數(shù)源代碼,和調(diào)用方法情況下得到其運(yùn)行時(shí)間
def test():
time.sleep(2)
print("函數(shù)test運(yùn)行了")
print("函數(shù)test運(yùn)行結(jié)束了")
"""
# 函數(shù)名作為入?yún)?-->高階函數(shù)
def timer(func):
def wrapper():
# 函數(shù)執(zhí)行前的時(shí)間
start_time = time.time()
func()
# 函數(shù)執(zhí)行后的時(shí)間
end_time = time.time()
# 相減得出運(yùn)行時(shí)間
res = end_time - start_time
print('運(yùn)行時(shí)間是:%s' %(res))
return res
return wrapper
@timer#------>=之前包裝的 test = timer(test)
def test():
time.sleep(2)
print("函數(shù)test運(yùn)行了")
print("函數(shù)test運(yùn)行結(jié)束了")
# test = timer(test)
test()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。