Python.三.(二)--2.闭包
三、 函数、类与面向对象编程 (OOP)标题函数参数与高阶函数装饰器与闭包面向对象三大特征类、对象与魔术方法异常处理装饰器依赖闭包实现二者共同为函数与OOP提供横切关注点分离和状态封装能力 先说核心结论闭包是机制装饰器是应用。装饰器本质上就是利用闭包来捕获并持有原函数及额外逻辑从而在不修改原代码的前提下增强函数/类的行为。在AI工程中它们让回调、损失函数、自定义层等实现得更优雅。一、闭包Closure是什么闭包是指有权访问另一个函数作用域中变量的内部函数即使外部函数已经返回内部函数仍能记住并访问这些变量。def make_multiplier(factor): def multiplier(x): # 内部函数 return x * factor # 捕获外部变量 factor return multiplier # 返回内部函数 double make_multiplier(2) print(double(5)) # 10 —— factor2 被记住了这里multiplier就是一个闭包它把factor这个状态携带了出去。关键特征内嵌函数 引用外层变量 外层函数已返回。二、装饰器Decorator是什么装饰器是一个接收函数、返回新函数的高阶函数用语法糖应用用于在不改原函数的前提下扩展功能即 AOP 面向切面编程思想。import time def timer(func): def wrapper(*args, **kwargs): start time.time() result func(*args, **kwargs) # 调用原函数 print(f耗时: {time.time()-start:.4f}s) return result return wrapper timer def train_one_epoch(): time.sleep(1) print(训练完成) train_one_epoch() # 输出: 训练完成 / 耗时: 1.0012stimer返回的wrapper正是一个闭包——它捕获了func这个原函数引用。三、二者的联系装饰器 闭包的应用场景这是理解二者关系的关键。来看对应关系闭包装饰器本质语言机制设计模式/语法糖核心动作内部函数捕获外层变量捕获原函数并包装增强关系底层支撑上层应用没有闭包装饰器就无法记住被装饰的原函数没有装饰器语法闭包的能力就无法如此优雅地复用。闭包提供携带状态的能力装饰器把这种能力专门用于包装函数。四、对函数、类与 OOP 的助益1. 装饰器对 OOP 的助益横切关注点分离日志、权限校验、缓存、重试等通用逻辑抽离为装饰器业务类保持纯净避免继承层级臃肿。类装饰器增强类行为可批量修改类的属性、方法甚至注册类。def singleton(cls): instances {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] cls(*args, **kwargs) return instances[cls] return get_instance singleton class ModelRegistry: pass内置装饰器即OOP基石staticmethod、classmethod、property本质都是装饰器它们定义了类方法/属性的语义。2. 闭包对 OOP 的助益轻量级状态封装不需要定义完整的类即可用闭包保存状态是类的函数式替代方案。工厂模式实现make_multiplier这类工厂函数用闭包替代工厂类更简洁。部分应用/柯里化固定部分参数生成新函数是函数式编程与OOP融合的桥梁。3. 在AI工程中的作用# 用闭包创建可配置的损失函数 def weighted_loss(weight1.0): def loss_fn(y_pred, y_true): return weight * ((y_pred - y_true) ** 2).mean() return loss_fn mse_double weighted_loss(2.0) # 携带 weight2.0 的闭包回调/钩子训练回调、梯度钩子常用闭包捕获上下文。自定义层/损失Keras、PyTorch 中以闭包形式参数化层行为。缓存与重试functools.lru_cache装饰器为推理函数加缓存避免重复计算。一句话总结闭包是 Python 中让函数携带状态的底层机制装饰器把这一机制封装成可复用的代码增强工具二者相辅相成让函数式风格与 OOP 在 AI 工程中各取所长——用闭包做轻量封装用装饰器做横切增强。

相关新闻

最新新闻

日新闻

周新闻

月新闻