iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Python

初學者的 30 天 Python 復健課程系列 第 26

復健第二十六天:可能聽不懂但會用就還好的裝飾器 decorator

  • 分享至 

  • xImage
  •  

裝飾器 Decorators

裝飾器是一種設計模式,允許用戶在不修改原始函式的結構下,為其添加新功能

如果要使用裝飾器的話,通常是在我們想要使用裝飾器的某個函式的**「定義之前」**放置使用。

創建裝飾器

要創建裝飾器函式,我們需要一個外部函式和一個內部包裝函式。

範例:

# 普通函式
def greeting():
    return 'Welcome to Python'

def uppercase_decorator(function):
    def wrapper():
        func = function()
        make_uppercase = func.upper()
        return make_uppercase
    return wrapper

g = uppercase_decorator(greeting)
print(g())          # WELCOME TO PYTHON

使用裝飾器

我們也可以用裝飾器來裝飾函式,讓程式更加簡潔。

# 使用裝飾器來裝飾函式
def uppercase_decorator(function):
    def wrapper():
        func = function()
        make_uppercase = func.upper()
        return make_uppercase
    return wrapper

@uppercase_decorator
def greeting():
    return 'Welcome to Python'

print(greeting())   # WELCOME TO PYTHON

對單個函式應用多個裝飾器

我也可以對一個函式使用多個裝飾器,這樣一個函式可增加多個附加功能。

# 第一個裝飾器
def uppercase_decorator(function):
    def wrapper():
        func = function()
        make_uppercase = func.upper()
        return make_uppercase
    return wrapper

# 第二個裝飾器
def split_string_decorator(function):
    def wrapper():
        func = function()
        splitted_string = func.split()
        return splitted_string
    return wrapper

@split_string_decorator
@uppercase_decorator
def greeting():
    return 'Welcome to Python'

print(greeting())  # ['WELCOME', 'TO', 'PYTHON']

這邊要特別注意的是,裝飾器的執行順序很重要,所以如果調動@split_string_decorator@uppercase_decorator 的先後順序,也會造成不同的結果,以上述的例子而言,會先將字串轉為大寫,接著將其切分成串列。

裝飾器接受參數

有一種情況是我們需要函式接受參數,因此我們可能需要定義一個能夠接受參數的裝飾器。

def decorator_with_parameters(function):
    def wrapper_accepting_parameters(para1, para2, para3):
        function(para1, para2, para3)
        print("I live in {}".format(para3))
    return wrapper_accepting_parameters

@decorator_with_parameters
def print_full_name(first_name, last_name, country):
    print("I am {} {}. I love to teach.".format(first_name, last_name, country))

print_full_name("Chien", "Chuan", "Taiwan")

上面的程式碼執行完的結果會先印出 I am Chien Chuan. I love to teach.,接著再印出 I live in Taiwan


上一篇
復健第二十五天:一開始有點難理解的閉包 closure
下一篇
復健第二十七天:學到現在只為搞懂這一刻的類別 Class 與物件 Object
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言