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

Python训练营打卡 Day29

复习日:类的装饰器

知识点回顾

类的装饰器:餐厅升级计划

假设你是一家餐厅的老板,餐厅已经运营了一段时间,但你希望提升服务质量,比如在每道菜上增加一些特别的服务(比如日志记录、额外的装饰等)。你不想重新设计整个餐厅的运营流程(即不修改现有的类定义),而是希望通过一些“升级计划”来实现这些目标。

类装饰器就像是一个“升级计划”,它可以接收一个类(餐厅的运营流程),然后返回一个修改后的类(升级后的运营流程)。通过这种方式,你可以在不改变原有类定义的情况下,为类添加新的功能。

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

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

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

1. 添加新的方法或属性(如示例中的 log 方法)。

2. 修改原有方法(如替换 __init__ 方法,添加日志)。

3. 甚至可以返回一个全新的类(继承或组合原类)。

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

# 定义类装饰器:为类添加日志功能
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("这是装饰器添加的日志方法")  # 调用装饰器新增的方法
  • 类装饰器 class_logger:就像是餐厅的“升级计划”,它接收一个类(餐厅的运营流程),然后返回一个修改后的类(升级后的运营流程)。

  • new_init 方法:在实例化对象时,记录日志,就像在餐厅的运营流程中增加了一个“欢迎顾客”的步骤。

  • log_message 方法:为类添加了一个新的日志方法,就像在餐厅的服务中增加了一个“记录顾客反馈”的步骤。

  • cls.log = log_message:将外部定义的方法绑定到类上,就像在餐厅的服务流程中动态添加了一个新的服务步骤。

装饰器思想的进一步理解:外部修改、动态

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

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

1. 在类定义内部直接写方法,这是静态方法,一般定义类都这么完成

class SimplePrinter:def print_text(self, text):print(f"打印内容:{text}")
  • 比喻:在餐厅的菜谱中直接写明每道菜的具体烹饪步骤。

2. 在类定义外部定义方法,然后把方法赋值给类的属性---这是一种动态方法,常在装饰器中使用,可以再外部修改类的方法。

def log_message(self, message):print(f"记录日志:{message}")SimplePrinter.log = log_message
  • 比喻:在餐厅的运营过程中,动态地添加一个新的服务步骤,比如“记录顾客反馈”。

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

类方法的定义:内部定义和外部定义

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

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

# 手动调用装饰器
SimplePrinter = class_logger(SimplePrinter)
  • 比喻:即使餐厅已经开业,你仍然可以通过“升级计划”来改进服务,而不需要重新设计整个餐厅。

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

作业:

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

对函数和类的理解
  • 函数:就像餐厅的“一道菜”,是完成特定任务的代码块。通过装饰器,可以为函数添加额外的功能,而不需要修改函数本身的代码。

  • :就像餐厅的“菜谱”,是对属性和方法的封装。通过类装饰器,可以在不修改类定义的情况下,为类添加新的方法或属性。

对 Python 的理解

经过29天的系统学习,完成了从编程基础到机器学习应用的知识闭环:

首先掌握了Python核心语法(变量、字符串、列表、循环判断等)和数据处理技能(缺失值处理、独热编码、特征筛选),构建了数据预处理能力;

接着深入机器学习全流程,涵盖建模评估(分类/回归模型)、模型优化(调参技巧、管道封装)和结果解释(SHAP可视化);

同时拓展了无监督学习领域(聚类算法、降维技术SVD/PCA)和算法设计思维(启发式算法);

最后通过函数封装、装饰器应用和面向对象编程,形成了模块化编程思维,并强化了工程化能力(异常处理、OS模块操作)。

整个体系以数据科学为核心,既包含描述性统计、热力图等数据分析方法,也覆盖从传统机器学习到深度学习的基础过渡,最终形成"数据清洗→特征工程→模型构建→结果解释"的完整解决方案能力

整体复习回顾-餐厅做菜

1. 餐厅核心架构
变量、字符串、列表 ➔ 食材和菜单
像餐厅需要米面蔬菜(变量)和菜品配方(字符串),菜单(列表)决定了能提供什么服务,是餐厅的基础原料和功能清单。

循环和判断语句 ➔ 厨房流水线
类似厨师按流程洗菜→切菜→炒菜(循环),根据订单类型(判断)决定做牛排还是沙拉,控制业务的核心运转逻辑。

2. 食材预处理区
缺失值处理 ➔ 食材质检员
像剔除发霉的蔬菜(删除缺失值)或用库存替代品填补(填充均值),确保食材完整可用。

独热编码/标签编码 ➔ 菜品标准化
将"辣度"(高/中/低)转成标准调料包编号(如001, 010, 100),让不同口味的菜品能被机器识别。

特征筛选 ➔ 食材精简师
像从100种香料中选出真正影响味道的5种核心调料(如八角、花椒),去除无关配料,提升菜品效率。

3. 厨房建模车间
机器学习模型 ➔ 主厨研发套餐
分类模型像设计儿童套餐/商务套餐(标签分类),回归模型像预测每日客流量(数值预测),聚类模型像按口味分组顾客(无监督分群)。

调参技巧 ➔ 火候调试师
调整炒菜的火候(学习率)、调料比例(正则化参数),让菜品(模型)达到最佳口感(准确率)。

Pipeline管道 ➔ 自动化流水线
将洗菜→切配→烹饪→装盘(数据清洗→编码→建模→输出)连成一条标准化生产线,减少人为失误。

4. 餐厅运营优化
热力图/SHAP图 ➔ 顾客反馈分析板
像用热力图显示"牛排销量最高时段",用SHAP图分析"价格和等待时间对差评的影响权重",找到经营瓶颈。

降维算法(PCA/SVD) ➔ 菜单精简策略
从200道菜中提炼出10道代表菜(保留核心特征),既满足多数顾客需求,又降低备菜复杂度。

启发式算法 ➔ 智能排班系统
像用遗传算法优化服务员排班表,在客流量波动时找到人力成本和效率的最优平衡点。

5. 高级服务与扩展
装饰器/类 ➔ VIP定制服务
装饰器像为常客提供免费甜点(不修改主函数,新增功能),类(Class)像设立包厢服务部,封装点餐、结账、清洁等专属流程。

异常处理 ➔ 应急预案手册
当厨房着火(程序报错)时,自动启动灭火流程(try-except),保障餐厅(系统)继续运行。

OS模块 ➔ 仓库管理系统
像自动整理食材库存(文件路径操作)、记录采购日志(读写文件),确保资源有序调用。

总结比喻
餐厅经营 ≈ 机器学习项目
食材采购(数据收集)→ 质检预处理(数据清洗)→ 研发菜品(特征工程)→ 厨房标准化生产(建模调参)→ 分析顾客反馈(模型解释)→ 优化菜单(模型迭代),最终目标是让餐厅(模型)高效盈利(准确预测),同时能灵活应对突发状况(鲁棒性)。

@浙大疏锦行

相关文章:

  • tomcat查看状态页及调优信息
  • 【数据结构】1-3 算法的时间复杂度
  • 掘金欧洲宠物经济新蓝海:比利时天然宠粮市场爆发与跨境新机遇
  • OpenSearch入门:从文档示例到查询实战
  • Linux `touch` 命令深度解析与高阶应用指南
  • 【Linux】第十七章 归档和传输文件
  • 大学量化投资课程
  • 深度剖析:YOLOv8融入UNetv2 SDI模块的性能提升之旅
  • 出现 Uncaught ReferenceError: process is not defined 错误
  • 《算法导论(第4版)》阅读笔记:p83-p85
  • MouseDown,MouseUp,LostMouseCapture的先后顺序
  • 【推荐】新准则下对照会计报表172个会计科目解释
  • Tomcat简述介绍
  • 面试题总结一
  • 静态网站部署:如何通过GitHub免费部署一个静态网站
  • 第二章:安卓端启动流程详解与疑难杂症调试手册
  • 软考 系统架构设计师系列知识点之杂项集萃(62)
  • 算法-js-最大矩形
  • FastDFS分布式文件系统架构学习(一)
  • 从零启动 Elasticsearch
  • 上海浦江游览南拓新航线首航,途经前滩、世博文化公园等景点
  • 夜读丨为萤火虫哭泣的夜晚
  • 聚焦智能浪潮下的创业突围,“青年草坪创新创业湃对”走进北杨人工智能小镇
  • 瑞幸首度牵手成都国际非遗节,用一杯饮品将非遗之美推向全国
  • 江南考古文脉探寻
  • 当“诈骗诱饵”盯上短剧