news 2026/6/10 0:30:31

Python 中装饰器和内存回收的说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 中装饰器和内存回收的说明

文章目录

  • 前言
    • Python 中装饰器和内存回收的说明
      • 1. Python 中的装饰器
        • 1.1. 说明
        • 1.2. 装饰器示例
      • 2. Python 内存回收

前言

如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


Python 中装饰器和内存回收的说明

1. Python 中的装饰器

装饰器是 Python 中一种高阶函数(能接收 / 返回函数的函数),核心作用是在不修改原函数代码、不改变原函数调用方式的前提下,为函数增加额外功能。

1.1. 说明

装饰器的底层是闭包(内部函数引用外部函数变量,且外部函数返回内部函数),@ 是装饰器的语法糖,让代码更简洁。

1.2. 装饰器示例
importtimefrom functoolsimportwraps from common.logimportget_logging_by_file logger=get_logging_by_file(__file__)def sec_to_hms(seconds): h=int(seconds //3600)m=int((seconds%3600)//60)s=seconds%60# 不转int,保留小数 return f'{h:02d}:{m:02d}:{s:.2f}' # 秒保留2位小数 def time_task(fn):""" 记录任务耗时 Parameters----------fn Returns-------""" @wraps(fn)# 保留原函数的元信息 def wrapper(*args,**kwargs):# 通用参数 start_time=time.time()res=fn(*args,**kwargs)# 原样传递所有参数 elapse_time=time.time()-start_time logger.info(f"Task 耗时:{sec_to_hms(int(elapse_time))}")returnresreturnwrapper

说明:
*args与**kwargs 是 Python 的可变参数语法,能让函数接受任意数量和类型的参数。
*args - 位置参数(Arguments)

  • 接收所有位置参数,打包成元组(tuple)。
  • 用法:函数调用时传的所有没指定名称的参数。

示例:

deftest(*args):print(args)# 打印元组if__name__=='__main__':test(1,2,3)# 输出: (1, 2, 3)test("a","b")# 输出: ('a', 'b')test()


**kwargs - 关键字参数(Keyword Arguments)

  • 接收所有关键字参数,打包成字典(dict)
  • 用法:函数调用时所有key=value形式的参数

示例:

deftest(**kwargs):print(kwargs)# 打印字典if__name__=='__main__':test(a=1,b=2)# 输出: {'a': 1, 'b': 2}test(name="Kimi")# 输出: {'name': 'Kimi'}test()# 输出: {}


整体逻辑:

调用 decorated_func(1,y=2)↓ 进入 wrapper(*args, **kwargs)args=(1,),kwargs={'y':2}记录开始时间 ↓ 执行 fn(*args, **kwargs)→ 实际调用的是原函数 func(1,y=2)↓ 获取返回值 res ↓ 记录耗时日志 ↓ 返回 res

测试代码:

importtimefromcommon.utilsimporttime_task@time_taskdefhhh(str1,**kwargs):time.sleep(10)print(f'str1:{str1}')print(f'打印字典:{kwargs}')returnf'处理完成:{str1}
fromtest.assembly.Test1importhhhif__name__=='__main__':hhh('哈哈啊',kkk=231,ooo=22)

注意的是 装饰器的函数名与 被装饰器的命名要保持一致,否则会失败。


与下面被装饰器的命名保持一致。

测试:

2. Python 内存回收

Python 的内存回收是解释器自动管理内存的机制,目的是回收程序不再使用的内存空间,避免内存泄漏。Python 不用手动调用 free() 或 delete,核心靠 “引用计数” 为主,“分代回收 + 标记清除” 为辅。

Python 的 GC 机制可以拆解为:
1、引用计数(即时回收):
触发回收的场景:引用计数归 0、对象被显式删除(del)、变量重新赋值等;
优点:实时性高,垃圾产生立即回收;缺点:无法处理循环引用,且引用计数增减会有性能开销。
2、分代回收(后台异步回收):
分代规则:新创建的对象属于 0 代,经过一次 GC 存活则进入 1 代,再存活进入 2 代;
触发条件:当 0 代对象数量达到阈值(默认 700),会触发 0 代 GC;0 代 GC 执行一定次数(默认 10)后,触发 1 代 GC;1 代 GC 执行一定次数后,触发 2 代 GC。
3、标记 - 清除(解决循环引用):
流程:暂停程序 → 遍历所有对象,标记可达对象 → 清除不可达对象 → 恢复程序;
仅针对容器对象(列表、字典、类实例等),因为只有容器对象才会产生循环引用。
4、手动干预:可以通过 gc 模块手动控制 GC,比如 gc.enable()(开启 GC)、gc.collect()(强制触发回收)、gc.get_count()(查看各代对象数量)。
补充:内存泄漏的常见场景 —— 全局变量持有大对象、循环引用未被打破、未关闭的文件 / 网络连接等;可以用 objgraph、tracemalloc 等工具排查内存问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:48:08

Open-AutoGLM mlx部署避坑手册(99%新手都会忽略的4个关键细节)

第一章:Open-AutoGLM mlx部署的核心挑战在将 Open-AutoGLM 部署至 MLX(Machine Learning X)平台的过程中,开发者面临一系列技术性挑战。这些挑战不仅涉及模型兼容性与性能优化,还包括资源调度与系统集成等多个层面。硬…

作者头像 李华
网站建设 2026/6/7 7:27:14

中小企业仓库管理系统研究和设计文献综述

本科生毕业设计(论文)文献综述 ( 2025届) 论文题目 中小企业仓库管理系统研究和设计 学生姓名 学号 2023212213062 专 业 计算机科学与技术(专升本) 班级 计算机2309 指导教师 李阳 职…

作者头像 李华
网站建设 2026/6/9 19:38:13

Truffle实战:编译部署测试智能合约全流程

Qwen3Guard-Gen-8B 部署与内容安全推理实战 在大模型应用爆发式增长的今天,一个被广泛忽视但至关重要的问题浮出水面:如何确保生成内容的安全性? 我们见过太多案例——聊天机器人输出歧视言论、AIGC平台生成违法信息、智能客服无意中引导用户…

作者头像 李华
网站建设 2026/6/7 7:27:28

2025-12-26工作周报

序号日期工作内容完成情况工作饱和度12025.12.22编辑测试文档完成100%22025.12.24优化测试文档,和测试用例完成100%32025.12.26修改项目出现的Bug完成100%遇到的问题:测试文档下周工作指标:完成项目的最后步骤

作者头像 李华
网站建设 2026/6/7 10:55:04

C语言实现GBK到Unicode编码转换

C语言实现GBK到Unicode编码转换 在中文信息处理的漫长演进中,字符编码始终是横亘于数据与系统之间的一道隐形关卡。尤其是在企业级AI工程实践中,即便今日主流已转向UTF-8,仍无法忽视大量遗留系统、老旧文档和区域性输入源带来的GBK编码挑战。…

作者头像 李华