您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python中的裝飾器可以做什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python中的裝飾器可以做什么”吧!
閱讀目錄
一 什么是裝飾器
二 裝飾器需要遵循的原則
三 實(shí)現(xiàn)裝飾器知識(shí)儲(chǔ)備
四 高階函數(shù)
五 函數(shù)嵌套
六 閉包
七 無(wú)參裝飾器
八 裝飾器應(yīng)用示例
一 什么是裝飾器
器即函數(shù)
裝飾即修飾,意指為其他函數(shù)添加新功能
裝飾器定義:本質(zhì)就是函數(shù),功能是為其他函數(shù)添加新功能
二 裝飾器需要遵循的原則
1.不修改被裝飾函數(shù)的源代碼(開(kāi)放封閉原則)
2.為被裝飾函數(shù)添加新功能后,不修改被修飾函數(shù)的調(diào)用方式
三 實(shí)現(xiàn)裝飾器知識(shí)儲(chǔ)備
裝飾器=高階函數(shù)+函數(shù)嵌套+閉包
四 高階函數(shù)
高階函數(shù)定義:
1.函數(shù)接收的參數(shù)是一個(gè)函數(shù)名
2.函數(shù)的返回值是一個(gè)函數(shù)名
3.滿(mǎn)足上述條件任意一個(gè),都可稱(chēng)之為高階函數(shù)
def foo():
print('我的函數(shù)名作為參數(shù)傳給高階函數(shù)')
def gao_jie1(func):
print('我就是高階函數(shù)1,我接收的參數(shù)名是%s' %func)
func()
def gao_jie2(func):
print('我就是高階函數(shù)2,我的返回值是%s' %func)
return func
gao_jie1(foo)
gao_jie2(foo)
#高階函數(shù)應(yīng)用1:把函數(shù)當(dāng)做參數(shù)傳給高階函數(shù)
import time
def foo():
print('from the foo')
def timmer(func):
start_time=time.time()
func()
stop_time=time.time()
print('函數(shù)%s 運(yùn)行時(shí)間是%s' %(func,stop_time-start_time))
timmer(foo)
#總結(jié):我們確實(shí)為函數(shù)foo增加了foo運(yùn)行時(shí)間的功能,但是foo原來(lái)的執(zhí)行方式是foo(),現(xiàn)在我們需要調(diào)用高階函數(shù)timmer(foo),改變了函數(shù)的調(diào)用方式
#高階函數(shù)應(yīng)用2:把函數(shù)名當(dāng)做參數(shù)傳給高階函數(shù),高階函數(shù)直接返回函數(shù)名
import time
def foo():
print('from the foo')
def timmer(func):
start_time=time.time()
return func
stop_time=time.time()
print('函數(shù)%s 運(yùn)行時(shí)間是%s' %(func,stop_time-start_time))
foo=timmer(foo)
foo()
#總結(jié):我們確實(shí)沒(méi)有改變foo的調(diào)用方式,但是我們也沒(méi)有為foo增加任何新功能
高階函數(shù)總結(jié)
1.函數(shù)接收的參數(shù)是一個(gè)函數(shù)名
作用:在不修改函數(shù)源代碼的前提下,為函數(shù)添加新功能,
不足:會(huì)改變函數(shù)的調(diào)用方式
2.函數(shù)的返回值是一個(gè)函數(shù)名
作用:不修改函數(shù)的調(diào)用方式
不足:不能添加新功能
五 函數(shù)嵌套
1 def father(name):
2 print('from father %s' %name)
3 def son():
4 print('from son')
5 def grandson():
6 print('from grandson')
7 grandson()
8 son()
9
10 father('tom')
六 閉包
1 '''
2 閉包:在一個(gè)作用域里放入定義變量,相當(dāng)于打了一個(gè)包
3 '''
4 def father(name):
5 def son():
6 # name='jack'
7 print('is [%s]' %name)
8 def grandson():
9 # name='wupeiqi'
10 print('is [%s]' %name)
11 grandson()
12 son()
13
14 father('jack')
七 無(wú)參裝飾器
無(wú)參裝飾器=高級(jí)函數(shù)+函數(shù)嵌套
基本框架
1 #這就是一個(gè)實(shí)現(xiàn)一個(gè)裝飾器最基本的架子
2 def timer(func):
3 def wrapper():
4 func()
5 return wrapper
加上參數(shù)
1 def timer(func):
2 def wrapper(*args,**kwargs):
3 func(*args,**kwargs)
4 return wrapper
加上功能
1 import time
2 def timer(func):
3 def wrapper(*args,**kwargs):
4 start_time=time.time()
5 func(*args,**kwargs)
6 stop_time=time.time()
7 print('函數(shù)[%s],運(yùn)行時(shí)間是[%s]' %(func,stop_time-start_time))
8 return wrapper
加上返回值
1 import time
2 def timer(func):
3 def wrapper(*args,**kwargs):
4 start_time=time.time()
5 res=func(*args,**kwargs)
6 stop_time=time.time()
7 print('函數(shù)[%s],運(yùn)行時(shí)間是[%s]' %(func,stop_time-start_time))
8 return res
9 return wrapper
使用裝飾器
1 def cal(array):
2 res=0
3 for i in array:
4 res+=i
5 return res
6
7 cal=timer(cal)
8 cal(range(10))
語(yǔ)法糖@
1 @timer #@timer就等同于cal=timer(cal)
2 def cal(array):
3 res=0
4 for i in array:
5 res+=i
6 return res
7
8 cal(range(10))
八 裝飾器應(yīng)用示例
user_list=[
{'name':'alex','passwd':'123'},
{'name':'linhaifeng','passwd':'123'},
{'name':'wupeiqi','passwd':'123'},
{'name':'yuanhao','passwd':'123'},
]
current_user={'username':None,'login':False}
def auth_deco(func):
def wrapper(*args,**kwargs):
if current_user['username'] and current_user['login']:
res=func(*args,**kwargs)
return res
username=input('用戶(hù)名: ').strip()
passwd=input('密碼: ').strip()
for index,user_dic in enumerate(user_list):
if username == user_dic['name'] and passwd == user_dic['passwd']:
current_user['username']=username
current_user['login']=True
res=func(*args,**kwargs)
return res
break
else:
print('用戶(hù)名或者密碼錯(cuò)誤,重新登錄')
return wrapper
@auth_deco
def index():
print('歡迎來(lái)到主頁(yè)面')
@auth_deco
def home():
print('這里是你家')
def shopping_car():
print('查看購(gòu)物車(chē)啊親')
def order():
print('查看訂單啊親')
print(user_list)
# index()
print(user_list)
home()
user_list=[
{'name':'tom','passwd':'123'},
{'name':'jack','passwd':'123'},
]
current_user={'username':None,'login':False}
def auth(auth_type='file'):
def auth_deco(func):
def wrapper(*args,**kwargs):
if auth_type == 'file':
if current_user['username'] and current_user['login']:
res=func(*args,**kwargs)
return res
username=input('用戶(hù)名: ').strip()
passwd=input('密碼: ').strip()
for index,user_dic in enumerate(user_list):
if username == user_dic['name'] and passwd == user_dic['passwd']:
current_user['username']=username
current_user['login']=True
res=func(*args,**kwargs)
return res
break
else:
print('用戶(hù)名或者密碼錯(cuò)誤,重新登錄')
elif auth_type == 'ldap':
print('auth')
res=func(*args,**kwargs)
return res
return wrapper
return auth_deco
#auth(auth_type='file')就是在運(yùn)行一個(gè)函數(shù),然后返回auth_deco,所以@auth(auth_type='file')
#就相當(dāng)于@auth_deco,只不過(guò)現(xiàn)在,我們的auth_deco作為一個(gè)閉包的應(yīng)用,外層的包auth給它留了一個(gè)auth_type='file'參數(shù)
@auth(auth_type='ldap')
def index():
print('歡迎來(lái)到主頁(yè)面')
@auth(auth_type='ldap')
def home():
print('home')
def shopping_car():
print('shopping')
def order():
print('check order')
# print(user_list)
index()
# print(user_list)
home()
感謝各位的閱讀,以上就是“Python中的裝飾器可以做什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python中的裝飾器可以做什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。