Overview

Decorator 是 Python 中的一種語法糖 (Syntax Candy),在程式中添加某種語法,將複雜的步驟化繁為簡,方便程式設計使用,讓程式更簡潔且具有更好的可讀性。

在 Python 中可以把 Decorator 當作一種特殊的 function,用來把「被裝飾」的函式當作參數傳入「裝飾器」函式,再把被裝飾的函式傳回。透過這樣的方法,可以將「被裝飾」的函式加上更多功能,能重複利用許多程式碼。

而 Python 中則是使用 @ 當作 Decorator 使用的符號。

Usage

不使用 Decorator

def my_decorator(func):
    print('裝飾器增加功能')
    return func

def my_func():
    print('被裝飾的函式')

new_func = my_decorator(my_func)
new_func()

輸出 :

裝飾器增加功能
被裝飾的函式

使用 Decorator

def my_decorator(func):
    print('裝飾器增加功能')
    return func

@my_decorator
def my_func():
    print('被裝飾的函式')

my_func()

輸出 :

裝飾器增加功能
被裝飾的函式

打包 Decorator 內的函式

在 Decorator 內新增一個函式 wrapper,並把要新增的功能寫在裡面,最後回傳傳入的函式。也就是打包 新增的功能 + 傳入的函式 成一個函式,並回傳這個函式。這樣做的差別是在宣告「被裝飾」的函式傳給 Decorator 時,不會執行到 Decorator 本身的內容,因為實際上內容被包在 wrapper 裡面。

def my_decorator(func):
    def wrapper():
        print('裝飾器增加功能')
        return func()
    return wrapper

def my_func():
    print('被裝飾的函式')

new_func = my_decorator(my_func)
new_func()

加入 Decorator 的方法跟前面一樣 :

def my_decorator(func):
    def wrapper():
        print('裝飾器增加功能')
        return func()
    return wrapper

@my_decorator
def my_func():
    print('被裝飾的函式')

my_func()

輸出 :