python函数装饰器

python函数装饰器

声明:博主并没有系统学习过python语言,在实际项目中遇到关于python不懂的语法,这里仅作为个人学习积累笔记

1.1 python函数相关基础

深入了解python函数装饰器移步:Python 函数装饰器
下面的笔记来源于上述链接
python中将函数赋值给变量,并不会执行该函数,函数只有加括号才会被调用

def hi():print("")greet = hi # 函数hi不会被调用,只是将函数赋值给了变量
hi() # 函数会被执行
# 若要通过greet来执行hi函数
greet() # 变量变为了函数

函数中嵌套函数,所有的嵌套函数会被一同执行,并且嵌套函数不能被外界单独访问

def hi():def greet():……def welcome():……
hi() #调用函数hi()则greet() welcome()会被一同调用

函数中嵌套函数时,从中返回某个特定嵌套函数

def hi(name="func1"):def greet():……def welcome():……if name == "func1":return greetelse:return welcome
a = hi() # 将hi()函数返回的函数赋值给a
print(a()) #调用a函数,即返回的greet函数

函数作为另一个函数的参数传入

def hi():……def func2(func1): print(func1())
func2(hi) #将函数hi作为参数传入函数func2,在func2中执行hi函数

1.2 装饰器的核心作用

Python函数装饰器是一种高阶函数,其核心作用是在不修改原函数代码的情况下动态扩展函数功能。这种特性使得装饰器在代码复用、功能解耦、逻辑增强等方面具有独特优势。

简单了解装饰器的其中一个作用:
动态功能扩展:为函数添加额外行为
装饰器的核心能力是在不改变原函数内部代码的情况下,为其包裹新的功能逻辑
例如实现函数调用日志记录:

def log_decorator(func):def wrapper(*args,**kwargs):print(f"[LOG] 开始执行 {func.__name__},参数:{args}")result = func(*args,**kwargs)  # 调用原函数print(f"[LOG] {func.__name__} 执行完成,结果:{result}")return resultreturn wrapper@log_decorator  # 等价于 add = log_decorator(add) 将原函数add作为参数传递给log_decorator函数
def add(a, b):  # add变量被重新绑定为log_decorator(add)的返回值(即内部函数wrapper)return a + badd(3, 5)
# 输出:
# [LOG] 开始执行 add,参数:(3, 5)
# [LOG] add 执行完成,结果:8

装饰器的应用阶段(代码加载时)当Python解释器加载@log_decorator语法时,会立即执行装饰器函数log_decorator:
函数调用阶段(运行时)当执行add(3, 5)时,实际调用的是被装饰后的wrapper函数
执行顺序

调用 add(3,5)
│
├─> 进入 wrapper(3,5)
│   ├─> 执行 [LOG] 开始执行 add,参数:(3,5)
│   ├─> 调用 func(3,5) → 原始add函数
│   │   └─> 计算 3+5=8
│   └─> 执行 [LOG] add 执行完成,结果:8
│
└─> 返回最终结果8

1.3 python函数装饰器的实际应用:请求限流

控制API调用频率:防止服务被恶意高频调用

def rate_limit(max_calls, period):def decorator(func):calls = []def wrapper(*args):now = time.time()# 清除超时记录calls[:] = [t for t in calls if now - t < period]if len(calls) >= max_calls:raise Exception("请求过于频繁")calls.append(now)return func(*args)return wrapperreturn decorator@rate_limit(5, 60)  # 每分钟最多5次, rate_limit返回decorator, decorator接收api_request函数
def api_request():  # api_request = rate_limit(api_request)# 调用外部API

代码结构拆解,该代码通过装饰器工厂实现了一个滑动窗口请求限流器,其核心结构分为三层:

rate_limit(max_calls, period)#装饰器工厂,接收最大调用次数(max_calls)和时间周期(period秒),返回实际装饰器decorator
decorator(func)#接收被装饰函数(如api_request),通过闭包维护调用时间记录列表calls,返回包装函数wrapper
wrapper(*args)#实现限流逻辑,包含时间窗口清理、调用计数验证、异常抛出等核心功能


Python普通函数与闭包函数对比分析
普通函数
(1)独立定义,无嵌套结构
(2)每次调用均为独立上下文,无状态记忆能力

使用普通函数实现计数器
缺点:全局变量不安全,多实例无法并存

count = 0  # 全局变量易被篡改
def increment():global countcount += 1return count
print(increment())  # 1
print(increment())  # 2

闭包函数
(1)嵌套函数结构,内部函数捕获外部函数变量
(2)通过闭包环境实现状态持久化

使用闭包函数实现计数器

def create_counter():count = 0def counter():nonlocal countcount += 1return countreturn counter  # 每个实例独立计数
counter1 = create_counter()
counter2 = create_counter()
print(counter1())  # 1(实例1独立计数)
print(counter2())  # 1(实例2独立计数)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 图形API(7)用于将笛卡尔坐标(x, y)转换为极坐标(magnitude, angle)函数cartToPolar()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算二维向量的大小和角度。 cartToPolar 函数计算每个二维向量 (x(I), y(I)) 的大小、角度&#xff0c;或同时计算两者&#xff1a; magnitude…

什么是向量搜索Vector Search?

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

搜索工具Everything下载安装使用教程(附安装包)

文章目录 前言一、搜索工具Everything介绍二、搜索工具Everything使用步骤1.软件下载2.版本选取3.启动软件4.文件搜索 前言 本教程将详细为您介绍 Everything 的下载、安装与使用方法&#xff0c;助您快速上手&#xff0c;充分利用这款工具的强大功能&#xff0c;告别文件查找…

element-plus中,Upload上传组件的使用 + 后端处理

目录 一. 案例一&#xff1a;用户更换个人头像 1.前端实现 2.后端实现 ①引入阿里云oss的依赖 ②编写AliOSSUtils工具类 ③编写controller层 ④编写service层 ⑤编写mapper层 3.效果展示 4.重点理解 结语 一. 案例一&#xff1a;用户更换个人头像 1.前端实现 <…

HarmonyOS-ArkUI Rcp模块类关系梳理

前言 本文重点解决的是&#xff0c;按照官网学习路径学习Tcp模块内容时&#xff0c;越看越混乱的问题。仿照官网案例&#xff0c;书写代码时&#xff0c;产生的各种疑惑。比如&#xff0c;类与类之间的关系&#xff0c;各种配置信息究竟有多少&#xff0c;为什么越写越混乱。那…

【云计算物理网络】数据中心网络架构设计

云计算的物理基础&#xff1a;数据中心网络架构设计 一、技术背景&#xff1a;从“三层架构”到“云原生网络”二、技术特点&#xff1a;云数据中心网络的四大支柱三、技术细节&#xff1a;CLOS架构的实现挑战四、未来方向&#xff1a;从“连接设备”到“感知服务”结语&#x…

window11 通过cmd命令行安装 oh my zsh 的教程

步骤 1&#xff1a;安装 WSL 2 和 Ubuntu 1. 以管理员身份打开 CMD wsl --install -d Ubuntu此命令会自动安装 WSL 2 和 Ubuntu 发行版。 安装完成后重启系统。 初始化 Ubuntu 在开始菜单中打开 Ubuntu&#xff0c;设置用户名和密码。 步骤 2&#xff1a;在 WSL 的 Ubunt…

gdb 调试命令记录

启动调试 gdb ./待调试的程序 #不带参数 (gdb) run #带参数 gdb --args ./your_program arg1 arg2 arg3 (gdb) run arg1 arg2 arg3 #图形化代码界面 (gdb) layout src基础调试命令 命令缩写作用run [args]r运行程序&#xff08;可带命令行参数&#xff09;break <locatio…

STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步

主题内容教学目的/扩展视频低功耗模式什么是低功耗&#xff0c;模式介绍&#xff0c;切换方法。为电池设备开发做准备。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、低功耗模式概述1.1 为什么需要低功耗模式&#xff1f;1.2 基本实现原理 二、低功耗模式的本…

JavaScript instanceof 运算符全解析

JavaScript instanceof 运算符全解析 核心语义: 判断一个对象(object)是否属于某个构造函数(constructor)或类的实例,基于原型链(prototype chain)实现类型检测。 一、JavaScript 中的基础用法 1. 语法结构 object instanceof constructor 返回值:布尔值(true/fal…

电脑基础之word基础操作

word是常用的办公软件之一&#xff0c;用于文档编辑&#xff0c;如合同/报告撰写、论文等‌。 一、简介 word文档最早由微软推出&#xff0c;通过Microsoft Office Word软件创建和编辑。由于涉及版权付费问题&#xff0c;大多数个人使用盗版软件。后来金山出了WPS office免费软…

深度解析Python代码中的广告信息提取与JSON处理

哈喽,大家好,我是木头左! 在当今数字化时代,广告无处不在,而从广告中提取关键信息并进行处理则成为了一项重要的技能。本文将深入剖析一段Python代码,该代码旨在从给定的JSON格式字符串中提取广告相关信息,并对其进行解析和处理。通过这段代码,将展示如何运用Python的j…

base64在线解码工具

我们经常会用到base64编码&#xff0c;相应的base64解码成为日常必备&#xff0c;所有我们需要拥有一个base64在线解码工具 base64在线解码工具

Linux——进程信号(3)(信号保存与信号捕捉)

进程信号3 信号保存信号相关概念详解信号集&#xff08;sigset_t&#xff09;及操作函数详解 信号捕捉信号捕捉的详细流程解析信号捕捉的核心概念信号捕捉的完整流程&#xff08;以 SIGQUIT 为例&#xff09; 信号保存 信号相关概念详解 1.核心概念 (1) 信号递达&#xff08…

批量在 txt 记事本文件的指定位置插入行,如在最末尾位置插入行

我们在网上下载的小说经常可以看到内容中每隔多少行都会现一些网站名称和联系方式等广告信息&#xff0c;这些都是固定或者随机插入在小说正文中的。那是怎么样实现在文本文件中指定位置插入这些行的呢&#xff1f;今天就给大家介绍一下如何在 txt 记事本文件或者其它类型的文本…

python的内存管理机制

目录 内存分配方式自动内存管理内存分配策略 垃圾回收机制引用计数垃圾回收对象创建和引用关系引用计数的状态删除变量 标记 - 清除垃圾回收 内存分配的区域划分栈内存堆内存 内存管理的优化内存池技术对象共享 Python 的内存管理机制是其运行效率和安全性的重要保障&#xff0…

火山引擎coze用户市场

火山引擎 **Coze**&#xff08;扣子&#xff09;的用户市场主要集中在 **需要快速构建和部署智能对话应用的企业及开发者群体**&#xff0c;覆盖多个行业与场景。以下是具体分析&#xff1a; --- ### **一、核心用户群体** 1. **企业用户** - **互联网/科技公司**&#…

Java 责任链模式 详解

责任链模式详解 一、责任链模式概述 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式&#xff0c;它允许你将请求沿着处理链传递&#xff0c;直到有一个处理者能够处理它为止。这种模式解耦了请求的发送者和接收者&#xff0c;使多个对象都有机会处理请求。…

【C++初阶】--- string类

1.STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.string类 2.1什么是string类 std::string 类是 C 标准库中用于处理和操作字符串…

Ubuntu 20.04 中 Git 的安装、配置和基本操作指南

本文为经验 所谈 使用版本为ubuntu20.04 1 ubuntu的git初始化 1.安装git sudo apt-get install git 可通过git --version 命令查看&#xff0c;正常输出git版本号即安装成功。 2.配置用户名和邮箱名 git config --global user.name "Your Name" git config --globa…