帶參數的裝飾器
裝飾器其實就是一個閉包函數,就是兩層的函數,就應該具有函數傳參功能。
login_status = {
'username': None,
'status': False,
}
def auth(func):
def inner(*args,**kwargs):
if login_status['status']:
ret = func()
return ret
username = input('請輸入用戶名:').strip()
password = input('請輸入密碼:').strip()
if username == '111' and password == '123':
login_status['status'] = True
ret = func()
return ret
return inner
def auth(x):
def auth2(func):
def inner(*args,**kwargs):
if login_status['status']:
ret = func()
return ret
username = input('請輸入用戶名:').strip()
password = input('請輸入密碼:').strip()
if username == '111' and password == '123':
login_status['status'] = True
ret = func()
return ret
return inner
return auth
舉例說明:抖音:綁定的是微信賬號密碼。 皮皮蝦:綁定的是qq的賬號密碼。 現在要完成的就是你的裝飾器要分情況去判斷賬號和密碼,不同的函數用的賬號和密碼來源不同。 但是之前寫的裝飾器只能接受一個參數就是函數名,所以寫一個可以接受參數的裝飾器。
def auth2(func):
def inner(*args, **kwargs):
if login_status['status']:
ret = func()
return ret
if 微信:
username = input('請輸入用戶名:').strip()
password = input('請輸入密碼:').strip()
if username == '111' and password == '123':
login_status['status'] = True
ret = func()
return ret
elif 'qq':
username = input('請輸入用戶名:').strip()
password = input('請輸入密碼:').strip()
if username == '111' and password == '123':
login_status['status'] = True
ret = func()
return ret
return inner
@auth2
def jitter():
print('記錄美好生活')
@auth2
def pipefish():
print('期待你的內涵神評論')
解決方式:
def auth(x):
def auth2(func):
def inner(*args, **kwargs):
if login_status['status']:
ret = func()
return ret
if x == 'wechat':
username = input('請輸入用戶名:').strip()
password = input('請輸入密碼:').strip()
if username == '111' and password == '123':
login_status['status'] = True
ret = func()
return ret
elif x == 'qq':
username = input('請輸入用戶名:').strip()
password = input('請輸入密碼:').strip()
if username == '111' and password == '123':
login_status['status'] = True
ret = func()
return ret
return inner
return auth2
@auth('wechat')
def jitter():
print('記錄美好生活')
@auth('qq')
def pipefish():
print('期待你的內涵神評論')
@auth('wechat') :分兩步:
第一步先執行auth('wechat')函數,得到返回值auth2
第二步@與auth2結合,形成裝飾器@auth2 然后在依次執行。這樣就是帶參數的裝飾器,參數可以傳入多個。
裝飾器裝飾多個函數
多個裝飾器裝飾一個函數:
def wrapper1(func):
def inner1(*args,**kwargs):
print("這是裝飾器一開始")
func(*args,**kwargs)
print("這是裝飾器一結束")
return inner1
def wrapper2(func):
def inner2(*args,**kwargs):
print("這是裝飾器二開始")
func(*args,**kwargs)
print("這是裝飾器二結束")
return inner2
@wrapper1
@wrapper2
def func():
print("這是被裝飾的函數")
func()
打印結果:
這是裝飾器一開始
這是裝飾器二開始
這是被裝飾的函數
這是裝飾器二結束
這是裝飾器一結束
Python規定多個裝飾器裝飾一個函數的時候先執行離被裝飾的函數最近的裝飾器