Python 装饰器(Decorators)
- 什么是装饰器?
装饰器(Decorator)本质上是一个 修改其他函数功能的函数。它的核心思想是:不修改原函数代码,动态添加新功能。比如:
记录函数执行时间
检查用户权限
缓存计算结果
自动重试失败操作
- 理解函数是“对象”
在 Python 中,函数也是对象,可以像变量一样传递。这是装饰器的核心基础!
示例 1:函数赋值给变量
python
复制
def say_hello():print("Hello!")
将函数赋值给变量
greet = say_hello
调用变量(实际调用函数)
greet() # 输出: Hello!
示例 2:函数作为参数传递
python
复制
def call_twice(func):func() # 第一次调用func() # 第二次调用call_twice(say_hello)
# 输出:
# Hello!
# Hello!
- 最简单的装饰器
假设我们要在函数执行前后打印日志:
步骤 1:定义一个装饰器函数
python
复制
def log_decorator(func):def wrapper():print("函数开始执行...")func() # 调用原函数print("函数执行完毕!")return wrapper # 返回新函数
步骤 2:使用装饰器
python
复制
@log_decorator # 语法糖(等价于 say_hello = log_decorator(say_hello)
def say_hello():print("Hello!")say_hello()# 输出:
# 函数开始执行...
# Hello!
# 函数执行完毕!
- 装饰器的执行过程
当使用 @log_decorator 时,实际发生了以下步骤:
传递函数:log_decorator(say_hello) 被调用,参数是原函数 say_hello
返回新函数:log_decorator 返回内部定义的 wrapper 函数
替换原函数:say_hello 变量指向新的 wrapper 函数
- 处理带参数的函数
如果被装饰的函数需要参数,怎么办?让 wrapper 接受参数并传递给原函数。
示例:记录函数参数
python
复制
def log_args(func):def wrapper(*args, **kwargs): # 接受任意参数print(f"参数: args={args}, kwargs={kwargs}")return func(*args, **kwargs) # 传递参数给原函数return wrapper@log_args
def add(a, b):return a + bprint(add(3, b=5))
# 输出:
# 参数: args=(3,), kwargs={'b': 5}
8
- 装饰器带参数
如果装饰器本身需要参数(比如指定日志级别),需要再包裹一层。
示例:根据日志级别打印
python
复制
def log_level(level): # 外层函数接受参数def decorator(func): # 装饰器函数def wrapper(*args, **kwargs):print(f"[{level}] 函数开始执行...")result = func(*args, **kwargs)print(f"[{level}] 函数执行完毕!")return resultreturn wrapperreturn decorator # 返回装饰器@log_level("INFO") # 等价于 add = log_level("INFO")(add)
def add(a, b):return a + badd(2, 3)
# 输出:
# [INFO] 函数开始执行...
# [INFO] 函数执行完毕!
- 保留原函数的信息
使用装饰器后,原函数的名称(name)和文档(doc)会被替换为 wrapper。用 functools.wraps 解决这个问题:
python
复制
from functools import wrapsdef log_decorator(func):@wraps(func) # 保留原函数信息def wrapper(*args, **kwargs):print("开始执行...")result = func(*args, **kwargs)print("执行完毕!")return resultreturn wrapper@log_decorator
def say_hello():"""打招呼的函数"""print("Hello!")print(say_hello.__name__) # 输出: say_hello(而不是 wrapper)
print(say_hello.__doc__) # 输出: 打招呼的函数
- 类装饰器
除了函数,还可以用类实现装饰器。通过实现 call 方法:
python
复制
class CountCalls:def __init__(self, func):self.func = funcself.calls = 0def __call__(self, *args, **kwargs):self.calls += 1print(f"函数被调用了 {self.calls} 次")return self.func(*args, **kwargs)@CountCalls
def say_hello():print("Hello!")say_hello() # 输出: 函数被调用了 1 次 → Hello!
say_hello() # 输出: 函数被调用了 2 次 → Hello
!
9. 实际应用场景
装饰器在 Python 中广泛应用,例如:
Web框架:@app.route(“/”)(Flask/Django)
权限验证:@login_required
性能测试:计算函数执行时间
缓存:@lru_cache(内置装饰器)
总结
核心思想:装饰器通过“函数嵌套”和“函数作为参数”实现功能扩展。
关键点:
使用 @decorator 语法糖
处理参数:*args 和 **kwargs
保留原函数信息:@wraps(func)
类装饰器:实现 call 方法
试着写几个自己的装饰器(比如记录执行时间),就能快速掌握这个概念!
相关文章:
Python 装饰器(Decorators)
什么是装饰器? 装饰器(Decorator)本质上是一个 修改其他函数功能的函数。它的核心思想是:不修改原函数代码,动态添加新功能。比如: 记录函数执行时间 检查用户权限 缓存计算结果 自动重试失败操作 理解…...
django orm的优缺点
Django ORM(对象关系映射)是 Django 框架的核心组件之一,它通过将数据库表映射为 Python 类,简化了数据库操作。以下是其优缺点总结: 优点 开发效率高 用 Python 类定义数据模型,无需手写 SQL,…...
国产RISC-V车规芯片当前现状分析——从市场与技术角度出发
摘要 随着汽车产业的智能化、电动化转型加速,车规级芯片的战略地位日益凸显。RISC-V指令集凭借其开源、灵活、低功耗等优势,成为国产车规芯片的重要发展方向。本文从市场与技术两个维度出发,深入分析国产RISC-V车规芯片的现状。通过梳理国内…...
不落因果与不昧因果
在佛教浩瀚的哲学体系中,“因果”是贯穿修行始终的核心命题。而“不落因果”与“不昧因果”这对看似矛盾的概念,恰似明镜的两面,映照出修行者对因果法则的不同认知层次。二者虽仅一字之差,却如天堑般分隔了迷悟两岸,其…...
《论语别裁》第02章 为政(08) 诗的伟大
孔子说我整理诗三百篇的宗旨在什么地方?“一言以蔽之”——一句话,“思无邪”。人不能没有思想,只要是思想不走歪曲的路,引导走上正路就好,譬如男女之爱。如果作学问的人,男女之爱都不能要,世界…...
在学校图书馆知识库中进行论文检索报告生成
首先登录信息门户—>科研服务—>机构知识库 在成果认领页面,查看自己的成果情况。如果发现自己的有些成果未被录入,可以发邮件给管理员。 最后,进入成果管理,选择需要的成果进行检索报告的生成...
《寒门枭雄传》章回体拟目与故事设计
《寒门枭雄传》章回体拟目与故事设计 主题:寒门逆袭的制度性困境与个人成长的撕裂性代价 第一回 贩履郎寒冬逢逼债 落魄汉雪夜定从戎 地点:京口草鞋摊→北府军营 人物:刘裕、刁逵(士族豪强)、刘母 故事: …...
头歌 | Linux之用户高级管理
若未实现预期结果, 可私信我帮你解答 2025-3-28 第1关:创建/删除用户组 > /data/workspace/myshixun/case1/evaluating.sh # 写入新内容 echo "echo 创建newGroup用户组成功 创建newGroupID用户组成功 设置newGroupID用户组ID成功 删除oldGroup用户组成功…...
常用的测试用例
登录、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求…...
数据结构与算法——顺序表的实现以及增、插、删、查、印、毁
文章目录 一、前言二、顺序表的概念与结构2.1顺序表的概念2.2顺序表的结构 三、顺序表的分类3.1静态顺序表3.1.1静态顺序表的弊端 3.2动态顺序表3.2.1动态顺序表的相对利弊3.2.2动态顺序表的增容方式 四、顺序表的增、插、删、查、印、毁4.1 顺序表的增容4.2顺序表的尾插和头插…...
环境 tensorflow ERROR: No matching distribution found for ai-edge-litert
提示:环境搭建 文章目录 前言多依赖安装 前言 提示:版本 之前文章 condajupyter 环境搭建 PyTorch 2.6 cpu 环境搭建 系统 :ubuntu 22.0 python :3.8 ERROR: No matching distribution found for ai-edge-litert PyTorch: sta…...
基于深度强化学习的智能机器人路径规划技术研究
在人工智能与机器人技术飞速发展的今天,智能机器人在工业、服务、物流等领域的应用日益广泛。路径规划作为智能机器人运动的核心技术之一,直接影响机器人的工作效率和安全性。近年来,深度强化学习(Deep Reinforcement Learning, D…...
【ManiSkill】环境success条件和reward函数学习笔记
1. “PickCube-v1” info["success"]:用于指示任务是否成功完成 布尔型张量,在环境的evaluate()方法中计算并返回: "success": is_obj_placed & is_robot_static这确保了机器人不仅能将物体准确放置在目标位置&am…...
畅捷通T+与吉客云数据集成案例解析
畅捷通T与吉客云的高效数据集成案例分享 在企业信息化系统中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例:如何将畅捷通T中的采购入库单(红字)数据无缝集成到吉客云中࿰…...
Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项?
大白话Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项? 在 Vue 项目里,$refs 是个超实用的工具,它能让你直接访问组件实例或者 DOM 元素。不过使用的时候,有一些地方可得注意,下面咱就详细…...
Docker Compose 基础知识
一. Docker Compose 引言 Docker Compose 是 Docker 官方提供的一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个yaml格式的配置文件(通常命名为 docker-compose.yml ),文件中定义多个服务、网络和卷,从而简化复杂应…...
科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线
地下管网作为城市公共安全的重要组成部分,担负着城市的信息传递、能源输送、排涝减灾等重要任务,是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市各功能区有机连接和运转的维系,因此,也被称为城市“生…...
EXCEL报错:无法共享此工作薄,因表包含excel表或xml映射的解决方法
在分享工作薄是,如果出现了“无法共享此工作薄,因表包含excel表或xml映射”的报错,那么有两个原因: 1.包含Excel表格,这个也是相对比较常见的原因。 首先选中表格。如果你不知道表的位置在哪,那么在Excel左…...
Go 语言标准库中path模块详细功能介绍与示例
Go语言的 path 模块提供了处理斜杠分隔路径的通用方法,适用于跨平台路径操作(如 URL 路径或 Unix 风格路径)。以下是 path 模块的核心方法及示例说明: 1. path.Base 返回路径的最后一个元素(类似 Unix 的 basename 命…...
在Vue 3 + TypeScript + Vite 项目中安装和使用 SCSS
在Vue 3 TypeScript Vite 项目中安装和使用 SCSS 1、安装 SCSS 的相关依赖 npm install sass --save-dev2、配置 Vite 对于 Vue 3,Vite 已经内置了对 SCSS 的支持,通常不需要额外的配置。但是,如果需要自定义配置,可以在路径…...
洛谷题单1-B2005 字符三角形-python-流程图重构
题目描述 给定一个字符,用它构造一个底边长 5 5 5 个字符,高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行,包含一个字符。 输出格式 该字符构成的等腰三角形,底边长 5 5 5 个字符,高 3 3 3 个字符…...
实现金蝶与钉钉无缝对接以高效管理银行账号信息
【资料】金蝶&钉钉—银行账号 在企业信息化管理中,数据的高效集成和实时同步至关重要。本文将分享一个实际的系统对接集成案例:如何将金蝶云星空的数据集成到钉钉平台,实现银行账号信息的无缝对接。 本次集成方案【资料】金蝶&钉钉…...
正则表达式-万能表达式
1、正则 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找 出满足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相关的文章: https://www.cnblogs.com/Simple-S…...
ComfyUi教程之阿里的万象2.1视频模型
ComfyUi教程之阿里的万象2.1视频模型 官网Wan 2.1 特点 一、本地安装1.1克隆仓库1.2 安装依赖(1.3)下载模型(1.4)CUDA和CUDNN 二、 使用体验(2.1)官方例子(2.2)执行过程(…...
如何在一个图片上添加另外一个图片
如果你使用的windows10 系统,可以使用系统自带的画图工具 1. 打开windows搜索, 画图工具 2. 在画图软件内, ctrlc 复制图片 , ctrlv粘贴图片 3. 调整想要粘贴的图片,到上图汇总,最后保存,或者…...
【面试题】在 CSS 中,实现一个 div 中的子 div 水平垂直居中
1. 使用 Flexbox 特点:简单、直观,现代浏览器支持良好。 代码: css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…...
Electron 项目开机自启动
app.setLoginItemSettings 与 auto-launch 对比分析 一、稳定性对比 1. app.setLoginItemSettings 优点:作为Electron官方API,有官方维护和支持缺点: 在某些Windows版本上存在已知问题部分Windows 10/11更新后可能失效在macOS权限更严格的…...
sql基础
本文多数内容属于个人基于网上资料的理解,如果有问题请告知修改,十分感谢 定义 百度百科:SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极…...
【C++数据库】SQLite3数据库连接与操作
注意:本文代码均为C++20标准下实现 一、SQLite3库安装 1.1 安装库文件 【工具】跨平台C++包管理利器vcpkg完全指南 vcpkg install sqlite3# 集成至系统目录,之前执行过此命令的无需再次执行 vcpkg integrate install1.2 验证代码 在VS2022中新建控制台项目,测试代码如下…...
数据结构——Map和Set
1. 搜索树 1. 概念 ⼆叉搜索树⼜称⼆叉排序树,它可以是⼀棵空树,或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空,则左⼦树上所有节点的值都⼩于根节点的值 • 若它的右⼦树不为空,则右⼦树上所有节点的值都⼤于根节点的值…...
zsh安装以及安装配置oh-my-zsh安装zsh-autosuggestionszsh-syntax-highlighting
下面是安装 zsh 及配置 oh‑my‑zsh 的详细步骤,适用于 Linux 和 macOS 环境: 1. 安装 zsh 1.1 在 macOS 上安装 zsh macOS 通常预装了 zsh,但建议升级到最新版本。你可以通过 Homebrew 来安装最新版: brew install zsh安装完成…...
VMware 安装 Ubuntu 实战分享
VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件,广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu,并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统:Windo…...
【SpringCloud】Eureka的使用
3. Eureka 3.1 Eureka 介绍 Eureka主要分为两个部分: EurekaServer: 作为注册中心Server端,向微服务应用程序提供服务注册,发现,健康检查等能力。 EurekaClient: 服务提供者,服务启动时,会向 EurekaS…...
Redis:List 类型 内部实现、命令及应用场景
Redis 中的 List(列表)类型是一种有序的数据结构,它可以存储多个字符串元素,并且这些元素按照插入顺序排列。可以将它理解为一个双向链表,支持在链表的两端进行快速的插入和删除操作。它允许元素重复,并且可…...
Python 字符串正则表达式详解
Python 字符串正则表达式详解 一、正则表达式核心语法 元字符含义正确示例与说明常见错误修正.匹配任意字符(换行符除外)a.b → 匹配"acb"、“a1b”不匹配换行符(需用re.S模式)^匹配字符串开头^Hello → 匹配以"H…...
重试机制之指针退避策略算法
一、目的:随着重试次数增加,逐步延长重连等待时间,避免加重服务器负担。 二、计算公式: 每次重试的延迟时间 初始间隔 (退避基数 ^ 重试次数) 通常设置上限防止等待时间过长。 const delay Math.min(initialDelay * Math.pow…...
pyqt第一个窗口程序
文章目录 官方文档相手动创建窗口程序designer创建ui布局 官方文档相 https://doc.qt.io/qtforpython-6/ 手动创建窗口程序 import sys # 导入系统模块,用于获取命令行参数和系统功能 from PySide6.QtWidgets import QApplication, QLabel # 导入Qt组件&#x…...
【蓝桥杯】单片机设计与开发,PWM
一、PWM概述 用来输出特定的模拟电压。 二、PWM的输出 三、例程一:单片机P34引脚输出1kHZ的频率 void Timer0Init(void);unsigned char PWMtt 0;void main(void) {P20XA0;P00X00;P20X80;P00XFF;Timer0Init();EA1;ET01;ET11;while(1);}void Timer0Init(void) //1…...
CSS学习笔记5——渐变属性+盒子模型阶段案例
目录 通俗易懂的解释 渐变的类型 1、线性渐变 渐变过程 2、径向渐变 如何理解CSS的径向渐变,以及其渐变属性 通俗易懂的解释 渐变属性 1. 形状(Shape) 2. 大小(Size) 3. 颜色停靠点(Color Sto…...
频谱分析仪的最大保持功能
专门应用于例如遥控器之类的,按一下,一瞬间出现的信号的测量。 把仪器连接天线,观测空间中的一些信号,比如WIFI的信号,我们可以看到仪器接收到的信号其实是一直变化的,并不是每一次扫描都能扫到我们想要的这…...
权值线段树算法讲解及例题
算法思想 普通的线段树一般是求区间之和或区间最值,所以这些线段树的每个节点的下标是原数组中的区间范围,每个节点存的是区间和或最值,而权值线段树的每个节点的下标是数组中元素的值,而权值线段树每个节点存的是当前元素出现的…...
3.26刷题(矩阵模拟专题)
1.59. 螺旋矩阵 II - 力扣(LeetCode) //方法一:变换方向法 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> dirct {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};vector<vect…...
深入解析 JSON-RPC:从基础到高级应用(附调用示例)
在当今的软件开发领域,远程过程调用(RPC)技术是实现分布式系统间通信的关键手段之一。JSON-RPC,作为一种基于 JSON 数据格式的轻量级 RPC 协议,因其简洁性和高效性而备受青睐。本文将全面深入地探讨 JSON-RPC 的核心概…...
MAC环境给docker换源
2025-03-28 MAC环境给docker换源 在官网下载docker ,dmg 文件 参考: https://blog.csdn.net/qq_73162098/article/details/145014490 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},&q…...
Ollama及HuggingFace路径环境变量设置
日常经常用到这俩的一些环境变量,特记录下来,如有错误,还请指正。 1. Ollama路径环境变量设置 Ollama 模型路径变量名为OLLAMA_MODELS,设置示例: 变量名示例OLLAMA_MODELS C:\Users\Administrator\.ollama\models D…...
Redis | 基于 Redis 实现机器列表 Token 缓存的 Java 实现
关注:CodingTechWork 引言 在分布式系统中,Token 缓存是一种常见的需求。它可以帮助我们快速验证用户身份,减少对数据库的频繁访问,提高系统的性能和响应速度。本文将介绍如何使用 Redis 来实现机器列表的 Token 缓存,…...
Linux\CentOS解决OpenSSH和Nginx安全漏洞
前言 由于有些服务器需要对公网提供服务、客户对于服务器安全比较重视,需要公司提供服务器安全报告。大多数服务器经过漏洞扫描之后、会出现很多软件低版本的漏洞,此时就需要升级软件的版本来解决这些漏洞问题。本篇文章记录升级软件过程。 漏洞编号漏…...
ubuntu22.04 ROS2humble 路径文件
ROS2humble 路径文件 /opt/ros/humble/include/opt/ros/humble/lib/opt/ros/humble/share 下载ros2之后会有下面的文件,在/opt/ros/humble下 /opt/ros/humble/include C/C 头文件(.h, .hpp) /opt/ros/humble/lib 作用: 存放 编译生成的二…...
zookeeper部署教程
在Linux系统中离线安装并配置ZooKeeper,可按以下步骤操作: 1. 准备安装包和依赖 下载ZooKeeper:在有网络的环境下,前往Apache ZooKeeper官网下载所需的稳定版本,例如zookeeper-3.8.2.tar.gz。准备JDK:Zoo…...
生成信息提取的大型语言模型综述
摘要 信息提取(IE)旨在从简单的自然语言文本中提取结构知识。最近,生成型大型语言模型(LLMs)在文本理解和生成方面表现出了显著的能力。因此,已经提出了许多基于生成范式将LLM集成到IE任务中的工作。为了对…...