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

Python_day29类的装饰器知识点回顾

DAY 29 复习日装饰器

知识点:

既然函数可以复用,有了类和装饰器,那么类还能进一步封装么?可以的,类也有装饰器

回顾一下,函数的装饰器是 :接收一个函数,返回一个修改后的函数。我们之前是用复用的思想来看装饰器的,换一个角度理解,当你想修改一个函数的时候,可以通过装饰器方法来修改而无需重新定义这个函数。

类也有修饰器,他的逻辑类似:接收一个类,返回一个修改后的类。例如

  1. 添加新的方法或属性(如示例中的 log 方法)。
  2. 修改原有方法(如替换 init 方法,添加日志)。
  3. 甚至可以返回一个全新的类(继承或组合原类)。

通过类装饰器,可以在不修改类内部代码的情况下,为多个类统一添加功能(如日志、统计)

类装饰器 vs 函数装饰器:核心区别

特性函数装饰器类装饰器
作用对象函数(function)类(class)
传入参数接收函数作为参数(def decorator(func):接收类作为参数(def decorator(cls):
返回值返回包装后的函数(通常是闭包)返回修改后的类(可以是原类或新类)
常见用途修改函数行为(如日志、计时、权限验证)修改类的结构(如添加属性、方法、修改初始化逻辑)
核心逻辑用闭包包裹函数,在不修改函数代码的前提下扩展功能直接修改类的定义(如添加/替换方法、属性)
# 定义类装饰器:为类添加日志功能
def class_logger(cls):# 保存原始的 __init__ 方法original_init = cls.__init__def new_init(self, *args, **kwargs):# 新增实例化日志print(f"[LOG] 实例化对象: {cls.__name__}")original_init(self, *args, **kwargs)  # 调用原始构造方法# 将类的 __init__ 方法替换为新方法cls.__init__ = new_init# 为类添加一个日志方法(示例)def log_message(self, message):print(f"[LOG] {message}")cls.log = log_message  # 将方法绑定到类,这是一种将外部函数添加为类的属性的方法return cls# 定义简单打印类,应用装饰器
# 同样是语法糖的写法
@class_logger
class SimplePrinter:def __init__(self, name):self.name = name  # 构造方法:初始化名称def print_text(self, text):"""简单打印方法"""print(f"{self.name}: {text}")# 使用示例
printer = SimplePrinter("Alice")  # 实例化时触发装饰器的日志
printer.print_text("Hello, World!")  # 调用普通方法
printer.log("这是装饰器添加的日志方法")  # 调用装饰器新增的方法
[LOG] 实例化对象: SimplePrinter
Alice: Hello, World!
[LOG] 这是装饰器添加的日志方法

注意到其中的cls.log = log_message 这行代码,他把外部的函数赋值给了类的新定义的属性,这里我们介绍这种写法

实际上,定义类的方法,有2类写法

  1. 在类定义内部直接写方法,这是静态方法,一般定义类都这么完成。
  2. 在类定义外部定义方法,然后把方法赋值给类的属性---这是一种动态方法,常在装饰器中使用,可以再外部修改类的方法。

本质区别

特性类内部定义方法外部赋值定义方法
语法在 class 块内使用 def定义函数后赋值给类属性(如 cls.fn = fn
作用域方法可以直接访问类的其他私有成员需要通过 self 或类名显式访问
动态性类定义后方法固定可以在运行时动态添加/修改方法
常见场景常规类定义装饰器、元类、动态编程

两种方式的本质都是将函数对象绑定到类的属性上,只是语法和应用场景不同。装饰器中常用外部赋值,是为了在不修改原类代码的情况下增强类的功能。

ps:之前无论是函数还是类的装饰器,我们都发现是先有装饰器,再有类。那既然我们说了装饰器除了让原本的代码更加清晰可读可复用,还具有修改函数or类的功能。那如何修改之前已经写好的类or函数呢?

所以你还是需要理解 装饰器本质就是一个语法糖,对类而言:@decorator 语法只是 MyClass = decorator(MyClass) 的简写,即使类已定义,仍可手动调用装饰器函数修改它。

总结:装饰器的核心是动态修改类 / 函数,而不改变原代码。通过外部赋值,可以在不修改类定义的前提下,为类添加新方法或修改已有方法。---理解动态的含义

知识点回顾

  1. 类的装饰器
  2. 装饰器思想进一步理解外部修改动态
  3. 类方法的定义内部定义外部定义

作业:复习函数知识点写下自己过去29学习心得如对函数和类的理解,对python这门工具的理解等,未来再过几个专题部分我们即将开启深度学习部分

总结:

一、对函数的理解:从工具到逻辑封装

最初接触函数时,我只把它当作“重复代码的打包工具”。但随着练习(如 describe_shape 函数处理任意关键字参数、 create_shape 工厂函数动态创建对象),我意识到函数的核心是 逻辑抽象 。

  • 参数的灵活性 : args 和 *kwargs 让函数能适配不同场景(比如 describe_shape 同时处理固定参数和任意尺寸描述),这种“弹性设计”大大提升了代码复用性。
  • 职责单一性 :每个函数只做一件事(如 calculate_area 专注计算面积),代码更易调试和维护。这让我明白,好的函数不是“大而全”,而是“小而精”。

二、对类的理解:从数据容器到对象建模

类的学习是思维的一次跳跃——从“过程式编程”转向“面向对象编程(OOP)”。通过定义 Circle 和 Rectangle 类,我真正体会到OOP的核心: 将数据(属性)与操作(方法)绑定,模拟现实世界的对象 。

  • 状态与行为的统一 : Circle 类的 radius 属性存储圆的状态, calculate_circumference 方法定义其行为(计算周长),这种“状态+行为”的封装让代码更符合现实逻辑。
  • 扩展性 :通过工厂函数 create_shape 动态创建不同图形对象,我初步感受到“多态”的魅力——未来添加新图形(如 Triangle )时,只需新增类并修改工厂函数,原有代码几乎不用改动。

三、对Python的理解:从“语言”到“工具链”

Python的简洁语法(如列表推导式、f-string)和强大标准库(如 math 模块)让我深刻体会到它为何是“最适合初学者的语言”。但更重要的是,Python的生态(如后续要学的深度学习框架)让它从“编程语言”升级为“全能工具链”:

  • 快速验证想法 :用函数和类快速封装逻辑,无需复杂配置即可运行测试(如直接打印 Circle(5).calculate_circumference() 验证结果)。
  • 无缝衔接高级应用 :现在学的函数和类,未来会是深度学习中“网络层定义”“数据加载器”的基础。比如,用类定义神经网络层(Layer),用函数封装数据预处理流程,这些都依赖当前的基本功。

四、未来期待:从基础到深度学习

即将开启的深度学习部分,对我来说既是挑战也是机遇。我期待:

  • 用类构建复杂模型 :比如用类定义神经网络的层(如全连接层、卷积层),通过继承和组合实现更复杂的网络结构。
  • 用函数优化训练流程 :将数据加载、模型训练、结果评估封装为函数,提升代码的可复用性和可维护性。
  • 理解“工具背后的逻辑” :Python的简洁可能隐藏了框架的复杂性(如PyTorch的自动求导),我希望通过学习,能从“会用工具”进阶到“理解工具如何工作”。

@浙大疏锦行

相关文章:

  • 王树森推荐系统公开课 排序02:Multi-gate Mixture-of-Experts (MMoE)
  • oracle 资源管理器的使用
  • Java IO及Netty框架学习小结
  • 游戏服务器之聊天频道设计
  • YOLOv5目标构建与损失计算
  • C#里与嵌入式系统W5500网络通讯(2)
  • (二十一)Java集合框架源码深度解析
  • 推理大模型与普通大模型的区别是什么?
  • 程序代码篇---ESP32的数据采集
  • Fine-Tuning Llama2 with LoRA
  • imx6ULL从应用程序到驱动程序
  • 【图像处理基石】OpenCV中都有哪些图像增强的工具?
  • 跨平台多用户环境下PDF表单“序列号生成的服务器端方案“
  • 大语言模型上下文长度:发展历程、局限与技术突破
  • INA226 高侧/低侧测量、双向电流/功率监视器,具有I2C兼容接口
  • 数字格式化库 accounting.js的使用说明
  • 什么是时间戳?怎么获取?有什么用
  • Java求职面试:从基础到复杂场景的技术深度解析
  • 【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】
  • JVM如何处理多线程内存抢占问题
  • 全总联合六部门印发工作指引,共保劳动者合法权益
  • 俄乌代表团抵达谈判会场
  • 高新波任西安电子科技大学校长
  • 我国城市规划“全面体检”套餐出台,城市体检将逐步与供地计划等挂钩
  • 《求是》杂志发表习近平总书记重要文章《锲而不舍落实中央八项规定精神,以优良党风引领社风民风》
  • 普京确定俄乌谈判俄方代表团名单