版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python高级核心编程第1章:装饰器与上下文管理器本章目录01装饰器原理深入理解闭包与函数包装的本质,掌握核心机制。02常用装饰器掌握@lru_cache、@contextmanager等Python实用工具。03上下文管理器解析with语句背后的__enter__与__exit__魔法方法。04实战案例通过计时统计和数据库连接管理,巩固所学知识。05常见问题排查装饰器使用中的陷阱与误区,避坑指南。06总结与任务回顾本章重点知识,并完成课后实操任务。为什么需要装饰器?核心价值:在不修改原函数代码的情况下,动态地为其增加功能场景1:代码复用多个函数需要相同的前置/后置处理(如日志记录、性能统计),避免重复编写代码。场景2:功能增强为第三方库的函数或无法修改的函数增加额外功能,实现非侵入式扩展。场景3:权限控制在函数执行前进行统一的权限校验,确保只有授权用户才能访问核心逻辑。场景4:缓存结果对计算密集型函数的结果进行缓存,避免重复计算,显著提升系统性能。装饰器原理:闭包(Closure)核心概念解析定义:内部函数引用外部作用域变量,且外部函数返回该内部函数。核心作用:保存函数的执行环境,实现数据的封装与隐藏。原理简述:闭包是装饰器的基础。它允许内部函数访问外部函数作用域中的变量,即使外部函数已经执行完毕。Python代码示例defouter(msg):definner():print(msg)#引用外部变量msgreturninnerhi_func=outer("Hi")hi_func()#输出:Hi装饰器基本结构与执行流程本质:接收函数作为参数,并返回一个新函数的闭包。标准结构(Python)defdecorator(func):defwrapper(*args,**kwargs):#前置逻辑(Before)result=func(*args,**kwargs)#后置逻辑(After)returnresultreturnwrapper执行流程解析1.接收参数:decorator接收被装饰函数func2.返回包装:返回内部定义的wrapper函数3.重新赋值:原函数名指向新的wrapper函数4.实际执行:调用原函数名时,执行wrapper逻辑原函数(func)装饰器(decorator)返回新函数(wrapper)调用新函数实战案例:函数执行时间统计核心逻辑解析装饰器封装:定义timer_decorator,在不修改原函数代码的情况下注入计时功能。时间记录:利用time.time()在函数执行前后分别打点,计算差值。通用适配:使用*args和**kwargs接收任意参数,保证装饰器的通用性。Python代码实现importtimedeftimer_decorator(func):defwrapper(*args,**kwargs):start=time.time()result=func(*args,**kwargs)print(f"耗时:{time.time()-start:.4f}s")returnresultreturnwrapper@timer_decorator#应用装饰器defslow_func(t):time.sleep(t)常用装饰器:@functools.lru_cache核心作用:避免重复计算缓存函数的返回结果,显著提升纯函数(输入决定输出)的性能,避免对相同参数的重复运算。适用场景:计算密集型任务适用于递归函数、复杂数学计算等参数重复率高的场景,能将指数级时间复杂度降低至线性。代码示例:斐波那契数列优化fromfunctoolsimportlru_cache@lru_cache(maxsize=None)#无限制缓存deffibonacci(n):ifn<2:returnnreturnfibonacci(n-1)+fibonacci(n-2)print(fibonacci(100))#秒级出结果什么是上下文管理器?核心定义与机制用于资源的自动申请和释放。确保在代码块执行完毕后,无论是否发生异常,资源都能被正确回收,避免资源泄漏。核心优势简洁性:替代繁琐的try-finally结构,代码更易读。安全性:自动化管理机制,杜绝因忘记释放资源导致的Bug。典型应用:with语句操作文件withopen('file.txt','r')asf:content=f.read()#无需手动调用f.close()#文件会被自动关闭在这个例子中,`with`语句创建了一个上下文环境。当代码块执行结束(包括发生异常时),文件对象的`__exit__`方法会被自动调用,从而确保文件被关闭。自定义上下文管理器:__enter__与__exit____enter__(self)方法进入with代码块时调用。其返回值会被赋给as关键字后的变量,通常返回资源对象。__exit__(...)方法退出with代码块时调用。包含exc_type,exc_val,exc_tb三个参数用于处理异常。若返回True表示异常已被处理,程序不会向外抛出。Python实现示例classMyContextManager:def__enter__(self):print("进入上下文")return"资源对象"def__exit__(self,exc_t,exc_v,exc_tb):print("退出上下文")returnTruewithMyContextManager()asres:print(f"使用{res}")常用工具:@contextmanager核心概念使用装饰器将生成器函数快速转换为上下文管理器,相比定义类的方式更简洁高效。实现原理映射yield之前的代码➜对应__enter__方法yield的值➜作为as后的资源对象yield之后的代码➜对应__exit__方法代码示例fromcontextlibimportcontextmanager
@contextmanagerdefmy_context():print("进入上下文")yield"资源对象"#传递给as变量print("退出上下文")
withmy_context()asres:print(f"使用{res}")实战案例:数据库连接上下文管理器核心功能机制连接创建进入上下文时自动建立数据库连接,初始化会话环境。事务提交与关闭无异常退出时提交事务,并确保连接资源被释放。异常回滚保护捕获异常时自动回滚事务,保证数据一致性。Python实现框架(sqlite3)fromcontextlibimportcontextmanagerimportsqlite3@contextmanagerdefdb_connection(db_name):conn=sqlite3.connect(db_name)try:yieldconn#返回连接对象mit()exceptException:conn.rollback()#异常回滚finally:conn.close()#确保关闭装饰器vs上下文管理器:对比分析装饰器(Decorator)核心目的:为函数动态添加功能,横向扩展作用对象:函数、方法、类代码结构:使用@decorator语法糖,基于闭包典型应用:日志记录、缓存、权限校验、性能统计核心特点:关注点在于为多个函数复用相同逻辑上下文管理器(ContextManager)核心目的:管理资源获取与释放,纵向安全管理作用对象:with语句包裹的代码块代码结构:with...as...:块,基于__enter__/__exit__典型应用:文件IO、数据库连接、锁管理、异常处理核心特点:关注点在于确保代码块执行前后的资源安全常见问题排查:丢失函数元信息问题:元信息被覆盖装饰后的函数,其__name__和__doc__会变成内部包装函数wrapper的信息。defdecorator(func):defwrapper():"""WrapperDoc"""func()returnwrapper@decoratordeforiginal():"""OriginalDoc"""passprint(original.__name__)#输出:wrapper解决方案:使用functools.wraps导入wraps装饰器,将原函数的元信息复制到包装函数中,保持函数身份。fromfunctoolsimportwrapsdefdecorator(func):@wraps(func)#关键修复:复制元信息defwrapper():func()returnwrapper常见问题排查:装饰器的嵌套与参数装饰器嵌套执行顺序多个装饰器叠加使用时,执行顺序是从下到上(Bottom-Up),即离函数最近的先执行。#装饰器定义(示意)@decorator1@decorator2deffunc():pass#等价于:func=decorator1(decorator2(func))带参数的装饰器实现需要在原有装饰器外层再包一层函数,专门用于接收参数,形成三层嵌套结构。defrepeat(times):#第一层:接收参数defdecorator(func):#第二层:装饰器本体defwrapper(*args):#第三层:包装函数for_inrange(times):func(*args)returnwrapperreturndecorator本章总结:Python进阶核心特性装饰器(Decorators)基于闭包原理,在不修改原函数代码的情况下,动态添加日志、缓存或计时等功能,实现函数增强。上下文管理器(ContextManagers)通过with语句实现资源的自动管理与释放(如文件、数据库连接),确保资源使用的安全性。核心工具库functools.wraps/lru_cache:保留元信息与缓存结果contextlib.contextmanager:快速生成上下文管理器最佳实践原则先分析需求场景:装饰器专注于"功能增强",上下文管理器专注于"资源安全"。选择合适的工具,写出更优雅的代码。课后实操任务:实现一个带参数的日志装饰器任务目标与实施步骤实现一个装饰器,根据传入的日志级别(info/warning/error),在函数执行时打印包含函数名、参数和返回值的日志。1.定义带参装饰器:外层函数接收l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年4月江苏扬州市邗江区卫生健康系统事业单位招聘专业技术人员20人备考题库附参考答案详解(突破训练)
- 2026湖北武汉市三级医院招聘14人备考题库带答案详解(b卷)
- 2026甘肃金昌永昌县红山窑镇卫生院招聘1人备考题库附参考答案详解(精练)
- 2026春季山东济宁市鱼台邮政校园招聘备考题库附参考答案详解(培优)
- 2026内蒙古呼和浩特市实验幼儿园招聘教师1人备考题库及答案详解【各地真题】
- 雨课堂学堂在线学堂云《食品理化检测技术(贵州农业职业学院)》单元测试考核答案
- 酿酒厂发酵工艺规范
- 2026山东济南市中心医院招聘卫生高级人才(控制总量)10人备考题库含答案详解(轻巧夺冠)
- 2026山东济南市第二妇幼保健院招聘卫生高级人才(控制总量)2人备考题库及参考答案详解(模拟题)
- 2026浙江丽水开放大学招聘专业技术人员1人备考题库附答案详解(完整版)
- 中药泡洗操作技术
- JJF(京) 159-2025 水质在线电导率仪校准规范
- 校园体育活动意外伤害应急处置
- 消毒供应资源高效利用与基层成本优化策略
- 二级股东合同范本
- 口腔门诊部医保自查报告
- (2025年)病理生理学期末考试练习题(含答案)
- 天然气管道防范第三方施工破坏安全培训课件
- 烟草配送员岗位安全培训课件
- 广东广州市海珠区统计局招聘统计专职人员笔试模拟试题及完整答案详解1套
- 生产运营月度会议汇报
评论
0/150
提交评论