1. 程式人生 > >python筆記--裝飾器

python筆記--裝飾器

裝飾器

裝飾器

裝飾器作用就是為自定義的函數添加功能,高階函數和閉包結合使用就可以形成裝飾器。簡單舉例說明:

#-*- 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筆記--裝飾器