標籤:裝飾器
裝飾器
裝飾器作用就是為自訂的函數添加功能,高階函數和閉包結合使用就可以形成裝飾器。簡單舉例說明:
#-*- coding:utf-8 -*-#假如我們有多個函數需要執行,但是執行前需要手工確認import sysdef my_print(): print ("this is a test!")def confirm(f): def inner(): my_confirm=input("是否繼續yes/no:") if my_confirm == 'yes': f() else: sys.exit() return innermy_print=confirm(my_print)my_print()
python支援一種友好的寫法,可以省去再次定義原來的函數:
#-*- coding:utf-8 -*-import sysdef confirm(f): def inner(): my_confirm=input("是否繼續yes/no:") if my_confirm == 'yes': f() else: sys.exit() return inner@confirm #在需要調用判斷功能的函數前加@def my_print(): print ("this is a test!")my_print()
如果被裝飾的功能函數有參數,在裝飾器內部也要添加對應的參數,簡單舉例說明:
#-*- coding:utf-8 -*-#裝飾器之功能函數加參數import sysdef confirm(f): def inner(*x,**y): my_confirm=input("是否繼續yes/no:") if my_confirm == 'yes': f(*x,**y) #注意f和inner的參數要一一對應 else: sys.exit() return inner@confirm def my_sum(*a,**b): result=0 for i in a: result+=i print(result)my_sum(1,2,3,4,5)
如果再為裝飾器添加一個功能,並且裝飾器可以傳參,只需要在原有裝飾器外部再添加一層嵌套函數,簡單舉例說明:
#-*- coding:utf-8 -*-import sysdef judge(default=0): def confirm(f): def inner(*x,**y): my_confirm=input("是否繼續yes/no:") if my_confirm == 'yes': print(f(*x,**y)) if f(*x,**y) > int(default): print('more') else: print('less') else: sys.exit() return inner return confirm@judge(10)def my_sum(*a,**b): result=0 for i in a: result+=i return(result) my_sum(1,2,3,4,5)
python筆記--裝飾器