装饰器decorator
装饰器本质#
装饰器的本质是一个函数
装饰器的实现:将函数作为参数传给装饰器,装饰器返回一个在原有基础上添加额外功能的新函数
装饰器示例-统计函数运行时间#
原始方式使用装饰器:#
import time
# 计算1-n之间每个数的平方相加
def calc_func(n):
sum = 0
for i in range(1, n + 1):
sum += i ** 2
return sum
# 定义装饰器,功能:计算函数运行时间
def elapsed_time(func):
def inner(*args, **kwargs):
start = time.time()
r = func(*args, **kwargs)
end = time.time()
print(f"运行时间:{end - start}")
return r
return inner
if __name__ == '__main__':
# 使用装饰器-方式一
calc_func = elapsed_time(calc_func)
res = calc_func(10000000)
print(res)
"""
输出:
运行时间:2.243622064590454
333333383333335000000
"""
语法糖@使用装饰器#
import time
# 定义装饰器,功能:计算函数运行时间
def elapsed_time(func):
def inner(*args, **kwargs):
start = time.time()
r = func(*args, **kwargs)
end = time.time()
print(f"运行时间:{end - start}")
return r
return inner
# 计算1-n之间每个数的平方相加
# 使用装饰器-方式二
@elapsed_time
def calc_func(n):
sum = 0
for i in range(1, n + 1):
sum += i ** 2
return sum
if __name__ == '__main__':
print(calc_func(10000000))
"""
输出:
运行时间:2.3276569843292236
333333383333335000000
"""
小结#
两种使用装饰器方法是等价的,@...是python的语法糖。
语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
进阶-给装饰器中传参#
想实现如@elapsed_precision(3)可以传参,请看如下代码
import time
# 定义装饰器
def elapsed_precision(precision):
def elapsed_time(func):
def inner(*args, **kwargs):
start = time.time()
r = func(*args, **kwargs)
end = time.time()
print(f"运行时间:{round(end - start, precision)}")
return r
return inner
return elapsed_time
# 计算1-n之间每个数的平方相加
# 使用装饰器
@elapsed_precision(3)
def calc_func(n):
sum = 0
for i in range(1, n + 1):
sum += i ** 2
return sum
if __name__ == '__main__':
print(calc_func(10000000))
"""
输出:
运行时间:2.221
333333383333335000000
"""
总#
所以想要理解装饰器,首先要明白在python中一切皆对象,函数是可以作为参数/变量传递的。装饰器本质上是一个函数,要装饰的函数作为参数传给装饰器,经装饰返回一个新函数
视频:https://www.bilibili.com/video/BV1e84y1D7TU?vd_source=aabfec6889cec4fa4fe8e19267634a32
作者:cloud-2-jane
出处:https://www.cnblogs.com/cloud-2-jane/articles/18563631
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架