程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python裝飾器, 就這?

編輯:Python

前言

本篇采用簡單的例子來講下「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
  1. 首先「函數引用」可以簡單理解為函數地址(類似go中的指針)。在python中可以簡單理解為, 使用 「函數引用()」 即可運行該函數地址所對應的函數
  2. 使用 demo = outer(5)後, demo即為inner函數的引用.然後使用demo(),相當於使用inner().
  3. inner函數接收了外部傳入的 a=5, 以及內部定義的局部變量 b=10, 最後輸出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()

簡單說明:

  1. 上面中的在run函數上面添加@collect_time的寫法, 相當於 collect_time(run)()
  2. 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'}
  • 輸入錯誤的用戶名 or 密碼, 返回登錄失敗的響應信息, 例如:
{"code": 403, "msg": "login fail"}

「代碼詳解 - 登錄鑒權裝飾器」

  1. 調用get_info(username="lucy", password="12345")時, 會將get_info這個函數引用當做參數傳遞給auth_user函數,返回auth_count的函數引用
  2. 隨後會運行auth_count函數,該函數接收的參數為 username="lucy", password="12345"
  3. auth_count函數裡面定義了一個字典形式的可變參數**kwargs, 然後從傳入的參數中獲取username 和 password
  4. auth_count函數內部根據解析的 username 和 password 來判斷是否正確.如果正確就返回用戶的登陸信息;錯誤的話,就返回403的error信息

以上就是今天關於裝飾器的分享


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved