阿里地区网站建设_网站建设公司_SEO优化_seo优化
2025/12/26 17:30:08 网站建设 项目流程

文章目录

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询