本篇采用简单的例子来讲下「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"
以上就是今天关于装饰器的分享