网站首页 > 技术文章 正文
装饰器的原理是利用了Python的函数特性,即函数可以作为参数传递给另一个函数,也可以作为另一个函数的返回值。装饰器本质上是一个接受一个函数作为参数,并返回一个新函数的函数。这个新函数通常会在执行原函数之前或之后添加一些额外的功能,从而实现对原函数的修改或增强。装饰器的语法是使用@符号,放在原函数的定义之前,表示将原函数作为参数传递给装饰器函数,并将返回的新函数替换原函数。
例如,下面是一个用于计算函数运行时间的装饰器的例子:
import time
def my_decorator(func): # 定义一个装饰器函数
def wrapper(*args, **kwargs): # 定义一个包装函数
start_time = time.time() # 记录开始时间
result = func(*args, **kwargs) # 调用原函数
end_time = time.time() # 记录结束时间
print("Function took {:.6f} seconds.".format(end_time - start_time)) # 打印运行时间
return result # 返回原函数的结果
return wrapper # 返回包装函数
@my_decorator # 使用装饰器
def my_function(x): # 定义一个需要被装饰的函数
time.sleep(x) # 模拟耗时操作
return x # 返回参数
print(my_function(2)) # 调用被装饰的函数
输出结果是:
Function took 2.000163 seconds.
2
可以看到,装饰器函数my_decorator接收一个函数func作为参数,并返回一个包装了原始函数的新函数wrapper。在wrapper函数中,我们在调用原始函数之前和之后分别记录了时间,并打印了运行时间。当我们使用@my_decorator修饰my_function时,相当于执行了my_function = my_decorator(my_function),即将my_function替换为wrapper。因此,当我们调用my_function时,实际上是调用了wrapper,从而实现了对my_function的修改。
猜你喜欢
- 2025-03-29 Python + Pytest 测试框架——数据驱动
- 2025-03-29 Python实现基于地图四色原理的遗传算法(GA)自动着色
- 2025-03-29 python之图像仿射变换分析:原理+图像平移
- 2025-03-29 LightGBM算法解释及举例python(lbg算法例题)
- 2025-03-29 K-Means算法原理及其python实现(学习笔记)
- 2025-03-29 Python虚拟机运行原理及加载流程(虚拟机配置python环境)
- 2025-03-29 原理+代码|Python实战多元线性回归模型
- 2025-03-29 Python内置装饰器:深入理解其原理和应用
- 2025-03-29 Python网络爬虫原理解构,原来如此简单!
- 2025-03-29 Python常用算法学习(4) 数据结构(原理+代码)-最全总结
- 05-27程序员用 Python 爬取抖音高颜值美女
- 05-27YOLO v3、FaceNet和SVM的人脸检测识别系统源码(python)分享
- 05-27「工具推荐」世界上最简单的人脸识别库 44.7 star
- 05-27开源人脸识别系统源码推荐
- 05-27Go 人脸识别教程
- 05-27Python 深度学习之人脸识别(yolo+facenet)
- 05-27简单的Py人脸识别
- 05-27Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 82℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)