Fluent Python - 装饰器 & 闭包笔记

本章节主要围绕装饰器与闭包的概念进行讲解。装饰器是一种代码扩展机制,它们在被装饰的函数定义完毕时立即执行,但函数的真正执行发生在调用时。装饰器实现方式多样,包括直接返回被装饰的函数或使用内嵌函数来改变其行为。装饰器执行时机在导入模块时即发生,而被装饰函数则在调用时执行。这与Python中的导入...
Fluent Python - 装饰器 & 闭包笔记
本章节主要围绕装饰器与闭包的概念进行讲解。装饰器是一种代码扩展机制,它们在被装饰的函数定义完毕时立即执行,但函数的真正执行发生在调用时。装饰器实现方式多样,包括直接返回被装饰的函数或使用内嵌函数来改变其行为。

装饰器执行时机在导入模块时即发生,而被装饰函数则在调用时执行。这与Python中的导入时间(如import time)与运行时(如runtime)存在区别。装饰器在实际应用中通常用于功能扩展、性能监控、日志记录等。

闭包是一种包含局部变量的函数,这些局部变量在函数执行完毕后仍保持引用,直到它们的生命周期结束。闭包通常用于实现状态保持、延迟计算等场景。一个闭包由函数与引用的非全局变量组成,即使函数体已执行完成,这些变量依然可用。

示例中介绍了闭包在实现平均值计算(如函数式实现和对象实现方法)中的应用。在函数式实现中,`make_averager` 返回一个 `averager` 对象,每次调用 `averager` 都会更新内部状态 `series` 并返回当前平均值。这展示了闭包如何在函数执行后保持对非局部变量的引用。

为了提高效率,避免使用列表存储历史值,可以使用 `cumsum` 和数据量来计算平均值。然而,对于不可变类型(如数字、字符串、元组),由于无法修改其值,直接引用这些变量可能导致不可预期的行为。通过使用 `nonlocal` 关键字声明变量为自由变量,可以解决这一问题,允许闭包中保持变量引用。

装饰器被用于扩展函数行为,如实现计时功能。通过装饰器 `clock` 包装 `factorial` 函数,不仅能够执行计时,还能在导入时改变函数名。此外,装饰器还可以通过 `functools.wraps` 保持装饰前后函数名的一致性。

标准库中提供了几种内置装饰器,如 `property`、`classmethod` 和 `staticmethod`,以及用于缓存计算结果的 `lru_cache` 和用于函数泛化处理的 `singledispatch`。这些装饰器在不同场景下提供高效、灵活的解决方案。

实现参数化装饰器允许装饰器接受额外参数,创建装饰器工厂以动态生成装饰器实例。这种机制使得装饰器更加灵活,能够根据特定需求配置功能。示例展示了如何通过参数化装饰器实现功能扩展,如注册函数到列表或提供更丰富的计时行为。2024-09-10
mengvlog 阅读 7 次 更新于 2025-07-20 03:41:48 我来答关注问题0
檬味博客在线解答立即免费咨询

Python相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部