日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python装饰器解析_Python 装饰器解析

發布時間:2023/12/10 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 装饰器解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。