对python装饰器几种常见方式的使用与理解
生活随笔
收集整理的這篇文章主要介紹了
对python装饰器几种常见方式的使用与理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、裝飾器的理論:
(1)裝飾器實際上就是一個函數
(2)有2個特別之處,參數是一個函數。返回值是一個參數
2、裝飾器的簡單理解:
實際上就是為了給一個程序添加功能,但是該程序已經上線或者已被使用,那么就不能大批量的修改源碼,這樣不現實,因此就產生了裝飾器。
注意點:
(1)不能修改被裝飾的函數的源代碼
(2)不能修改被裝飾的函數的調用方式
3、裝飾器的組成方式:
函數+實參高階函數+返回值高階函數+嵌套函數+語法糖 = 裝飾器
有關高階函數的理解:
(1)把一個函數名當作實參傳給另外一個函數(”實參高階函數“)(2)返回值中包含函數名(”返回值高階函數“)嵌套函數的理解:
嵌套函數指的是在函數內部定義一個函數,而不是調用。語法糖:
寫法:@xx ,一般寫在函數的上方4、真正裝飾器的開始之處:
裝飾器在裝飾時,需要在每個函數前面加上@xxx
(1) 裝飾無參函數,示例代碼如下:
#裝飾器裝飾的函數無參數 def timer(func): #func其實指的就是testdef deco():start = time.time()func() #這里其實是對test的調用stop = time.time()print (stop-start)return deco@timer #test函數使用裝飾器 def test():time.sleep(2)print ("test is running") test()打印結果: test is running 2.003510952(2)裝飾有參函數,示例代碼如下:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #裝飾器裝飾的函數有參數 def timer(func):def deco(*args,**kwargs): #添加可變參數*args和**kwargsstart = time.time()func(*args,**kwargs) #這里也是一樣,添加可變參數*args和**kwargsstop = time.time()print (stop-start)return deco@timer def test(value): #test函數有個參數value,正因為裝飾器timer裝飾的函數test有參數value,因此在timer中的有了可變參數time.sleep(2)print ("test is running %s" %value) test("22")打印結果: test is running 22 2.00424408913(3)帶參數的裝飾器,示例代碼如下:
#裝飾器帶參數 def timer(parameter):def out_wapper(func):def wapper(*wargs,**kwargs):if parameter == "task1":start = time.time()func(*wargs,**kwargs)stop = time.time()print ("the task1 is run:",stop-start)elif parameter == "task2":func(*wargs, **kwargs)print ("the task2 is run:")return wapperreturn out_wapper@timer(parameter = "task1") def task1():time.sleep(2)print "in the task1"@timer(parameter = "task2") def task2():time.sleep(2)print "in the task2"task1() task2()打印結果: in the task1('the task1 is run:', 2.002906084060669)in the task2the task2 is run:總結
以上是生活随笔為你收集整理的对python装饰器几种常见方式的使用与理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中面向切片编程(AOP)和装
- 下一篇: python字符串\列表中查找出某个值且