python学习必备知识点: 装饰器
生活随笔
收集整理的這篇文章主要介紹了
python学习必备知识点: 装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、裝飾器定義
裝飾器(Decorators)是 Python 的一個重要部分。簡單地說:他們是修改其他函數的功能的函數。他們有助于讓我們的代碼更簡短。
應用場景:
假如:此時寫了很多函數,有一個新的需求需要在多個函數中添加或者修改一個功能,如果每個函數都修改一次顯得太過繁重,此時裝飾器就出現了。
首先定義一個裝飾器,寫好要修改或者添加的功能,每個函數前用@裝飾器名稱,即可調用裝飾器函數。
定義一個裝飾器:
def outer(func):def inner():print ("start")r = func() # r = Noneprint ("end")return rreturn inner # 注意:返回的只是函數名,不是inner()定義一個函數,并引用裝飾器:
@outer # 引用裝飾器 def faa():print ("faa")a = faa() print (a)查看執行結果
start faa end從執行結果我們可以看出裝飾器的執行順序,先執行裝飾器的部分功能,再執行普通方法中,然后執行裝飾器其它代碼,順序可以根據需求調整。
@作用:
- 執行outer函數,并將@下面的函數名傳給outer函數,當做參數。
- 將outer函數的返回值重新賦值給faa faa=outter的返回值
- 本質上:相當于在原來的函數faa的基礎上,前后增加了一些操作。將原函數封裝到另外一個函數上,并將返回值重新賦值給原函數
二、裝飾器加參數。
裝飾器內部調用函數時,假如函數需要傳參,那么以上代碼無法滿足傳參的需求。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def outer(func):def inner(a1,a2):print ("==== start =====")r = func(a1,a2)print ("==== end ====")return rreturn inner@outer def faa(a1,a2):print ("普通函數中的功能")# ============= 執行結果 ================ ret = faa("a","b") print (ret)以上代碼即可實現傳參功能。
但是我們會發現這樣傳參很不靈活,既假如還有其它函數需要傳參,而傳參的個數或者參數的類型不一樣,那么以上代碼則無法滿足其它函數傳參。
三、裝飾器傳多個參數
普通函數傳多個參數:
def fun(*args,**kwargs):print (args)print (kwargs)fun("a1","a2",k1="steven",k2="18")# ============= 返回結果 ============== ('a1', 'a2') {'k2': '18', 'k1': 'steven'}裝飾器傳參
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def outer(func):def inner(*args,**kwargs):print ("=" * 20)print ("裝飾器 start")r = func(*args,**kwargs)print ("裝飾器,end")return rreturn inner@outer def fun1(a1):print ("fun1 一個參數")@outer def fun2(a1,a2):print ("fun2 兩個參數")@outer def fun3(*args,**kwargs):print (args)print (kwargs)ret1 = fun1("f1_a1") ret2 = fun2("f2_a1","f2_a2") ret3 = fun3("f3_a1","f3_a3",k1="k1",k2="k2")#返回結果 ==================== 裝飾器 start fun1 一個參數 裝飾器,end ==================== 裝飾器 start fun2 兩個參數 裝飾器,end ==================== 裝飾器 start ('f3_a1', 'f3_a3') {'k1': 'k1', 'k2': 'k2'} 裝飾器,end四、添加多個裝飾器
def outer(func):def inner(*args,**kwargs):print ("="*20)print ("裝飾器outer start")r = func(*args,**kwargs)print ("裝飾器outer end")return rreturn innerdef outer_1(func):def inner(*args,**kwargs):print ('='*20)print ("裝飾器outer_1 start")r = func(*args,**kwargs)print ("裝飾器outer_1 end")return rreturn inner@outer @outer_1 def fun1(a1):print ("fun1")f1 = fun1("多個裝飾器")#返回值==================== 裝飾器outer start ==================== 裝飾器outer_1 start fun1 裝飾器outer_1 end 裝飾器outer end看懂了嗎?不懂關系,小編創建了一個Python學習交流QQ群:531509025,群里有大量基礎入門知識,都是從零開始的,群里還有專業的人給你解答問題。尋找有志同道合的小伙伴,互幫互助,群里還有不錯PDF電子書!
總結
以上是生活随笔為你收集整理的python学习必备知识点: 装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python必备知识点:对Json的基本
- 下一篇: Python学习基础必备知识点:字典di