python筆記--裝飾器
阿新 • • 發佈:2018-04-19
裝飾器裝飾器
裝飾器作用就是為自定義的函數添加功能,高階函數和閉包結合使用就可以形成裝飾器。簡單舉例說明:
#-*- coding:utf-8 -*- #假如我們有多個函數需要執行,但是執行前需要手工確認 import sys def 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 inner my_print=confirm(my_print) my_print()
python支持一種友好的寫法,可以省去再次定義原來的函數:
#-*- coding:utf-8 -*- import sys def 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 sys def 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 sys def 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筆記--裝飾器