iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
佛心分享-IT 人自學之術

Python 學習筆記系列 第 23

筆記Day23:裝飾器 Decorator

  • 分享至 

  • xImage
  •  

今天來説説裝飾器 Decorator,其實裝飾器就是一個接收函式並回傳新函式的語法糖,核心原理為「函式是一等公民,可以被傳遞、包裝與回傳」,主要是用來輔助其他的函式,假如程式中只有定義裝飾器那是沒有任何用處的。

換句話說,裝飾器是一個「函式包裝函式」的設計模式,用來抽離重複邏輯,讓程式更乾淨。

定義裝飾器

def decorator_name(callback_func):
    def inside_func():
        callback_func()
    return inside_func

使用裝飾器

@decorator_name
def func():
    ...
func()

這裡的@decorator_name只是語法糖,等價於:

result = decorator_name(func)

當呼叫帶有裝飾器的函式時,會先執行裝飾器內部程式碼再執行原本的程式碼。

def hello(callback):
    def inside_func():
        print("裝飾器")
        callback()
    return inside_func

@hello
def world():
    print("普通函式")

world()
# 裝飾器
# 普通函式

帶有參數的裝飾器

def add(callback):
    def run():
        result = 0
        for i in range(51):
            result += i
        callback(result)
    return run

@add
def show(result):
    print("結果:", result)

show() # 結果: 1275

多層裝飾器

def upper(callback):
    def wrapper():
        return callback().upper()
    return wrapper

def exclaim(func):
    def wrapper():
        return func() + " world."
    return wrapper

@exclaim
@upper
def message():
    return "hello"

print(message()) # HELLO world.

裝飾器的實際應用場景

這邊使用Django框架舉例,某些 API 是需要經過權限驗證才能夠登入使用,這時內建的裝飾器就派上用場了。

def login_required(func):
    @wraps(func)
    def wrapper(user, *args, **kwargs):
        if not user.is_authenticated:
            raise Exception("需要登入")
        return func(user, *args, **kwargs)
    return wrapper

根據以上裝飾器來看,在需要使用的地方加上@login_required就可以做到權限驗證!是不是挺方便的XD

@login_required
def subscribe(request):
    user = request.user
    member = Member.objects.get(username=user.username)
    if request.method == "POST":
        if member.member_status == "1":
            return render(request, "pages/index.html", {"member_status": True})
        else:
            member.member_status = "1"
            member.save()
            return render(request, "pages/index.html", {"member_status": True})
    else:
        return render(request, "pages/index.html",{"member_status": member.member_status == "1"})

那麼今天就介紹到這,明天見ㄅㄅ!


上一篇
筆記Day22:高階函式 Higher Order Function
下一篇
筆記Day24:虛擬環境
系列文
Python 學習筆記24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言