本篇采用簡單的例子來講下「python的裝飾器」.
「目標」是: 大家看完以後, 可以達到自己「手寫一個簡單裝飾器」的效果!
定義: 函數的形式是函數嵌套函數的形式,其中內部函數調用外部函數傳入的變量值,並且外部函數最終返回內部函數的引用, 那麼內部函數稱為「閉包」
舉個例子來解釋一下
def outer(a):
b = 10
def inner():
print(a + b)
# 外函數返回內函數的引用
return inner
if __name__ == '__main__':
demo = outer(5)
print(demo) # <function outer.<locals>.inner at 0x000001EDAD6D88B8>
demo() # 15
上面介紹了閉包, 外部函數接收到的是一個變量, 如果把接收這個變量->接收函數的引用, 那麼就可以理解為是個裝飾器了
裝飾器的主要作用: 在不改變原來函數的基礎上, 為函數增添一些額外功能
裝飾器的常見應用: 「統計函數運行時間」, 「進行登錄鑒權」等.下面通過2個示例簡單介紹下
「統計函數運行時間的裝飾器」
import time
def collect_time(func):
def test():
t1 = time.time()
func()
t2 = time.time()
print("運行時間為: ", t2 - t1)
return test
# 常見寫法
@collect_time
def run():
time.sleep(2)
if __name__ == '__main__':
run()
簡單說明:
collect_time(run)()
collect_time(run)()
意為將run函數的引用傳遞給collect_time函數, 然後運行collect_time(), 計算傳入函數的運行時間「登錄鑒權裝飾器 - demo示例」
def auth_user(func):
def auth_count(**kwargs):
username = kwargs["username"]
password = kwargs["password"]
if username == "lucy" and password == "12345":
verify = True
else:
verify = False
if verify:
return {"code": 200, "data": func(username), "msg": "login succ"}
else:
return {"code": 403, "msg": "login fail"}
return auth_count
@auth_user
def get_info(username="", password=""):
return {"username": username, "login_time": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}
if __name__ == '__main__':
# 正常用例
print(get_info(username="lucy", password="12345"))
# 錯誤用例
# print(get_info(username="lucy", password="dfs"))
效果:
{'code': 200, 'data': {'username': 'lucy', 'login_time': '2022-01-18 12:26:00'}, 'msg': 'login succ'}
{"code": 403, "msg": "login fail"}
「代碼詳解 - 登錄鑒權裝飾器」
get_info(username="lucy", password="12345")
時, 會將get_info這個函數引用當做參數傳遞給auth_user函數,返回auth_count的函數引用username="lucy", password="12345"
以上就是今天關於裝飾器的分享