python装饰器解析_Python 装饰器解析
一、裝飾器定義:本質是函數,(裝飾其他函數)就是為其他函數添加附加功能
二、裝飾器的作用:在不改變原函數的情況下,為原函數前后添加新的功能
三、裝飾器的原則:
1、不能修改被裝飾的函數的源代碼
2、不能修改被裝飾函數的調用方式
四、裝飾器的組成:由作用域、高階函數以及閉包組成
閉包的概念:如果在一個內部函數里面,對外部作用域(但不是在全局作用域)的變量進行引用,那么內部函數就被認為是閉包
五、裝飾器模板:
需要注意的是帶參數的裝飾器執行順序為先執行@符號后面的內容,即先將參數傳進裝飾器中
defwrapper(func):def inner(*args,**kwargs):'被裝飾函數之前添加的內容'ret= func(*args,**kwargs)'被裝飾函數之后添加的內容'
returnretreturn inner
普通裝飾器模板
defouter(形參)defwrapper(func):def inner(*args,**kwargs):'被裝飾函數之前添加的內容'ret= func(*args,**kwargs)'被裝飾函數之后添加的內容'
returnretreturninnerreturnwrapper
@outer(True)def 原函數()
帶參數的裝飾器模板
六、裝飾器實例
實例一、
# 1.編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源于文件),
# 2.要求登錄成功一次,后續的函數都無需再輸入用戶名和密碼
"""
思路:
1、首先寫兩個其他需要被裝飾的函數
2、然后寫裝飾器函數模板
3、補充優化裝飾器函數的內容,即登錄功能的驗證
"""
代碼:
FLAG = False #設置狀態,用來判斷當前是否已經成功登陸
deflogin(func):def inner(*args, **kwargs):globalFLAGifFLAG:
ret= func(*args, **kwargs)returnretelse:
username= input('請輸入用戶名:')
password= input('請輸入密碼:')if username == 'bangsheng' and password == '123456':
FLAG= True #成功登陸后改變狀態值
ret = func(*args, **kwargs) #func是被裝飾的函數
returnretelse:print('登錄失敗')returninner
@logindefshop_add():print('添加一件商品')#多個裝飾器裝飾一個函數,執行順序為先執行離def最近的那個裝飾器,這里表示先執行@log這個裝飾器
@logindefshop_del():print('刪除一件商品')
shop_add()
shop_del()
實例二、
# 2.編寫裝飾器,為多個函數加上記錄調用功能,要求每次調用函數都將被調用的函數名稱寫入文件
importtimedeflog(func):def inners(*args, **kwargs):
with open('log', 'a', encoding='utf-8') as f:
f.write(str(time.strftime('%Y-%m-%d %H:%M:%S')) + ' ' + (func.__name__ + '\n'))'''time.strftime為格式化輸出時間,
time.time()獲取的時間格式為1970年到現在的秒數
time.local.time()獲取到的也是秒數'''ret= func(*args, **kwargs)returnretreturninners
@logdefshop_add():print('添加一件商品')
@logdefshop_del():print('刪除一件商品')
shop_add()
shop_del()
實例三、多個裝飾器裝飾同一個函數
#多個裝飾器裝飾一個函數,執行順序為先執行離def最近的那個裝飾器,這里表示先執行@log這個裝飾器
1 importtime2
3 FLAG =False4
5
6 deflogin(func):7 def inner(*args, **kwargs):8 globalFLAG9 ifFLAG:10 ret = func(*args, **kwargs)11 returnret12 else:13 username = input('請輸入用戶名:')14 password = input('請輸入密碼:')15 if username == 'bangsheng' and password == '123456':16 FLAG =True17 ret = func(*args, **kwargs) #func是被裝飾的函數
18 returnret19 else:20 print('登錄失敗')21
22 returninner23
24
25 #2.編寫裝飾器,為多個函數加上記錄調用功能,要求每次調用函數都將被調用的函數名稱寫入文件
26 deflog(func):27 def inners(*args, **kwargs):28 with open('log', 'a', encoding='utf-8') as f:29 f.write(str(time.strftime('%Y-%m-%d %H:%M:%S')) + ' ' + (func.__name__ + '\n'))30 '''
31 time.strftime為格式化輸出時間,32 time.time()獲取的時間格式為1970年到現在的秒數33 time.local.time()獲取到的也是秒數34 '''
35 ret = func(*args, **kwargs)36 returnret37
38 returninners39
40
41 @login42 @log43 defshop_add():44 print('添加一件商品')45
46 #多個裝飾器裝飾一個函數,執行順序為先執行離def最近的那個裝飾器,這里表示先執行@log這個裝飾器
47 @login48 @log49 defshop_del():50 print('刪除一件商品')51
52
53 shop_add()54 shop_del()
多個裝飾器裝飾同一個函數
實例四、帶參數的裝飾器
'''
通過一個帶參數的裝飾器可以整體控制裝飾器是否生效
只需要在全局變量中將FLAGE的狀態變化為False就可以使裝飾器失效
'''
1 '''
2 帶參數的裝飾器,可以通過一個參數來控制裝飾器是否被啟用3 '''
4
5 FLAGE =True6 deftimmer_outer(FLAGE):7 deftimmer(func):8 def inner(*args,**kwargs):9 ifFLAGE:10 start =time.time()11 ret = func(*args,**kwargs)12 end =time.time()13 print(start-end)14 returnret15 else:16 ret = func(*args,**kwargs)17 returnret18 returninner19 returntimmer20
21 '''
22 通過一個帶參數的裝飾器可以整體控制裝飾器是否生效23 只需要在全局變量中將FLAGE的狀態變化為False就可以使裝飾器失效24 '''
25 @timmer_outer(FLAGE)26 defnufront():27 time.sleep(0.1)28 print('新岸線公司')29
30 @timmer_outer(FLAGE)31 defhst():32 time.sleep(0.2)33 print('HST')
帶參數的裝飾器
總結
以上是生活随笔為你收集整理的python装饰器解析_Python 装饰器解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php gd gif动画,我可以检测使用
- 下一篇: python第三方库全部_自动更新Pyt