今天來説説裝飾器 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"})
那麼今天就介紹到這,明天見ㄅㄅ!