当前位置: 首页 > news >正文

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 等工具排查内存问题。

http://www.gsyq.cn/news/158847.html

相关文章:

  • Redshift数据迁移至MaxCompute技术方案
  • Java毕设项目:基于springboot的学生公寓系统(源码+文档,讲解、调试运行,定制等)
  • Win7系统程序终止问题的全面修复方案
  • Vivado安装教程 - Vivado ML Standard(免费)版
  • 费马点问题与旋转构造的巧妙应用
  • P7275 计树
  • 深度解析 | 红蓝对抗实战:如何构建企业级网络安全主动防御体系?
  • 别再手动写代码了!Python调用Open-AutoGLM实现智能生成的3种场景
  • 告别手动调参时代,Open-AutoGLM如何实现全流程自主优化?
  • 0195-03682驱动器模块
  • DXC蒲公英计划:为神经多样性IT专业人士赋能
  • vLLM-Ascend 部署与推理服务化实战
  • 郑州家装公司推荐:华埔装饰以原创设计与全案整装引领品质家居新标准 - 深度智识库
  • 视频直播点播平台EasyDSS核心技术解析与多场景应用实践
  • 从零到上线:Python调用Open-AutoGLM接口全流程详解,少走3个月弯路
  • Exchange 2007 属性及对应GUID参考
  • Redshift迁移MaxCompute:S3到OSS数据同步方案
  • 西门子1200伺服步进FB块程序:超实用的编程利器
  • Docker从入门到实践:核心概念与实战指南
  • 基于Freemarker与JBIG压缩生成PDF电子凭证
  • 255.0.0.0子网掩码对应的CIDR前缀是什么
  • 2025年最佳沥青清扫车、场地清扫机、车间扫地清洁车推荐榜单
  • 2025上海营业执照办理服务商TOP5权威推荐:加急办理/靠谱服务/供应商甄选指南 - 工业设备
  • Power BI数据直接回写SQL Server的两种方法
  • 2025智能硅砂蜂巢结构雨水回用系统TOP5权威推荐 - 工业品网
  • Linux Fundamentals Part 1 26.12.2025
  • 华为5G网管操作全解析:参数设置与指令指南
  • 2.5D Generator 2.0:PS一键生成2.5D插画神器
  • 光栅衍射主极大个数与大学物理光学解析
  • 老化路径如何影响锂离子电池热失控?